Условный атрибут Html.TextBox с ASP.NET Предварительный просмотр MVC 5

StackOverflow https://stackoverflow.com/questions/177673

Вопрос

У меня есть строго типизированный элемент управления представлением MVC, который отвечает за пользовательский интерфейс, в котором пользователи могут создавать и редактировать клиентские элементы.Я бы хотел, чтобы они могли определить ClientId при создании, но не редактировании, и это должно быть отражено в пользовательском интерфейсе.

С этой целью у меня есть следующая строка:

<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId, new 
 { @readonly = 
   (ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0 
      ? "readonly" : "false") 
 } )
%>

Кажется, что независимо от того, какое значение я придаю атрибуту readonly (даже "false" и """), Firefox и IE7 делают входные данные доступными только для чтения, что раздражающе нелогично.Есть ли хороший способ, основанный на троичном операторе, полностью удалить атрибут, если он не требуется?

Это было полезно?

Решение

Сложная проблема ... Однако, если вы хотите определить только атрибут readonly , вы можете сделать это следующим образом:

<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId, 
  ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0 
    ? new { @readonly =  "readonly" } 
    : null) 
%>

Если вы хотите определить больше атрибутов, вы должны определить два анонимных типа и иметь несколько копий атрибутов. Например, что-то вроде этого (что мне все равно не нравится):

ClientId.Length > 0 
  ? (object)new { @readonly = "readonly", @class = "myCSS" } 
  : (object)new { @class = "myCSS" }

Другие советы

Если вы хотите определить несколько атрибутов и условный доступ только для чтения без дублирования других атрибутов, вы можете использовать словарь вместо анонимных типов для атрибутов.

например ,

Dictionary<string, object> htmlAttributes = new Dictionary<string, object>();
htmlAttributes.Add("class", "myCSS");
htmlAttributes.Add("data-attr1", "val1");
htmlAttributes.Add("data-attr2", "val2");
if (Model.LoggedInData.IsAdmin == false)
{
    htmlAttributes.Add("readonly", "readonly");
}


@:User: @Html.TextBoxFor(
    m => m.User,
    htmlAttributes)  

И альтернативой является просто выдать его как обычный старый HTML. Да, редактор заставит вас думать, что вы не правы, но это часто случается с VS2008SP1. Этот пример специально для флажков, которые в CTP5 кажутся полностью бесполезными, но он дает вам представление о том, как генерировать условные атрибуты.

<input type="checkbox" name="roles" value='<%# Eval("Name") %>' 
  <%# ((bool) Eval("InRole")) ? "checked" : "" %> 
  <%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> />

Совет. Это просто наличие атрибута readonly / disabled, который делает элемент доступным только для чтения или отключенным в браузере.

@Html.TextBoxFor(x => x.Name, isReadonly ?(object) new { @readonly = true } : new { /*Some other attributes*/ })

Я думаю, что это должно быть

<%= ((bool) Eval("InRole")) ? "checked" : "" %> 

вместо этого в проказах отвечу.

<%# ((bool) Eval("InRole")) ? "checked" : "" %> 

По крайней мере, у меня не получилось с #, но с =. Я сделал что-то не так? В любом случае, спасибо за совет:)

$ (function () {   $ (& Quot; [только для чтения = 'ложь'] & Quot;) removeAttr (& Quot; & Quot только для чтения;).  });

Я использую это:

   @Html.TextAreaFor(model => model.ComentarioGestor, comentarioGestor? new { @class = "form-control" } : new { @class = "form-control", @readonly = "readonly" } as object)

Я испробовал большинство из приведенных выше предложений, и теперь я пришел к простейшему с одной строкой. Объедините 2 объекта анонимных атрибутов HTML, объявив один из них как «объект». тип.

@Html.TextBoxFor(m => m.Email, !isEdit ? new { id = "email_box" } : new { id = "email_box", @readonly = isEdit ? "readonly" : "false" } as object)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top