Условный атрибут Html.TextBox с ASP.NET MVC Preview 5 - PullRequest
29 голосов
/ 07 октября 2008

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

Ответы [ 8 ]

37 голосов
/ 07 октября 2008

Сложная проблема ... Однако, если вы хотите определить только атрибут 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" }
27 голосов
/ 11 декабря 2012

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

, например

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)  
4 голосов
/ 23 ноября 2015

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

@Html.TextBoxFor(x => x.Name, isReadonly ?(object) new { @readonly = true } : new { /*Some other attributes*/ })
4 голосов
/ 07 октября 2008

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

<input type="checkbox" name="roles" value='<%# Eval("Name") %>' 
  <%# ((bool) Eval("InRole")) ? "checked" : "" %> 
  <%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> />
1 голос
/ 04 декабря 2008

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

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

вместо этого в ответе прокаженного.

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

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

0 голосов
/ 10 мая 2017

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

   @Html.TextAreaFor(model => model.ComentarioGestor, comentarioGestor? new { @class = "form-control" } : new { @class = "form-control", @readonly = "readonly" } as object)
0 голосов
/ 05 июня 2014

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

@Html.TextBoxFor(m => m.Email, !isEdit ? new { id = "email_box" } : new { id = "email_box", @readonly = isEdit ? "readonly" : "false" } as object)
0 голосов
/ 09 августа 2010
$ (function () { $ ( "[Только для чтения = 'ложь']") removeAttr ( "ReadOnly"). });
...