2008-10-07 8 views
27

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

Для этого у меня есть следующие строки:

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

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

ответ

35

Жесткая проблема ... Тем не менее, если вы хотите определить только атрибут 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" } 
+0

+1 Мой первый выстрел был второй фрагмент кода без броска к объекту.Его легко упускать из виду, но реально необходимо. – 2012-06-18 15:55:32

4

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

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

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

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

вместо этого в leppies ответить.

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

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

0
$ (функция() { $ ("[только для чтения = 'ложь']") removeAttr ("только для чтения");. });
21

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

например.

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) 
+1

Должен быть ответ, потому что он избегает повторения. – 2013-12-02 17:29:15

-2

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

@Html.TextBoxFor(m => m.Email, !isEdit ? new { id = "email_box" } : new { id = "email_box", @readonly = isEdit ? "readonly" : "false" } as object) 
+0

Это не работает для меня; `@readonly = false` по-прежнему интерпретируется как` readonly` – 2015-10-16 09:16:50

2

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

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

, почему анонимный класс должен быть передан объекту для первого условия тройной операции? Не оспаривать это, просто пытаясь понять это. Благодаря! – eaglei22 2017-06-09 16:42:41

0

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

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