Условный атрибут Html.TextBox в ASP.NET MVC Preview 5

У меня есть строго типизированный элемент управления представлением 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 делают ввод только для чтения, что досадно противоречит интуиции. Есть ли хороший способ полностью удалить атрибут на основе тернарного оператора, если он не требуется?


person tags2k    schedule 07.10.2008    source источник


Ответы (7)


Сложная проблема ... Однако, если вы хотите определить только атрибут 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" }
person Panos    schedule 07.10.2008
comment
+1 Моим первым снимком был второй фрагмент кода без приведения к объекту. Это легко не заметить, но это действительно необходимо. - person Mathias F; 18.06.2012

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

e.g.

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)  
person Aviko    schedule 11.12.2012
comment
Должен быть ответ, потому что он избегает повторения. - person Ian Warburton; 02.12.2013

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

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

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

@Html.TextBoxFor(x => x.Name, isReadonly ?(object) new { @readonly = true } : new { /*Some other attributes*/ })
person pranavn    schedule 23.11.2015
comment
почему анонимный класс должен быть приведен к объекту для первого условия тернарного оператора? Не оспаривая это, просто пытаясь понять это. Спасибо! - person eaglei22; 09.06.2017

Я думаю так должно быть

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

вместо этого в ответе леппи.

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

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

person Olaj    schedule 04.12.2008

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

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

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

@Html.TextBoxFor(m => m.Email, !isEdit ? new { id = "email_box" } : new { id = "email_box", @readonly = isEdit ? "readonly" : "false" } as object)
person cronixis    schedule 05.06.2014
comment
У меня это не работает; @readonly = false по-прежнему интерпретируется как readonly - person Manuel Reis; 16.10.2015