Как избежать повторяющихся встроенных условий для определения htmlAttributes Html.EditorFor()

Я создаю форму, и мне нужно использовать inline-условие для добавления атрибута readonly html:

@Html.LabelFor(model => model.EventDate)
<div>
 <div>
 @Html.EditorFor(model => model.EventDate, new
 {
 htmlAttributes = Model.IsEditorReadOnly ?
 (object)new { @class = "form-control input-lg", @type = "date", @readonly = "readonly" } :
 (object)new { @class = "form-control input-lg", @type = "date" }
 })
 </div>
</div>
@Html.ValidationMessageFor(model => model.EventDate)

Вы не можете использовать условие только для значения свойства @readonly, потому что, даже если оно установлено в null, оно будет выдано клиенту как readonly="", и этого достаточно, чтобы браузер сделал это поле только для чтения.

Должен быть лучший способ сделать это, чем встроенное условие для каждого элемента формы только для добавления одного атрибута, правильно?

1 ответ

Благодаря Стивен Мюекке за всю помощь (дайте ему все свои голоса выше в комментариях и на связанные ответы). Здесь решение.

Для модели с этим свойством:

[Display(Name = "Event Date")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:MM-dd-yyyy}", ApplyFormatInEditMode = true)]
[Range(typeof(DateTime), "01-01-2010", "12-31-2030")]
public DateTime? EventDate { get; set; }

Создайте этот метод расширения:

public static IHtmlString ReadOnlyEditorFor<tmodel, tvalue="">(this HtmlHelper<tmodel> html, Expression<func<tmodel, tvalue="">> expression, object
htmlAttributes = null, bool isReadOnly = false)
{
 IDictionary<string, object=""> attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
 if (isReadOnly)
 {
 attributes.Add("readonly", "readonly");
 }
 return html.EditorFor(expression, new { htmlAttributes = attributes });
}
</string,></func<tmodel,></tmodel></tmodel,>

И затем используйте его в представлении следующим образом:

@Html.ReadOnlyEditorFor(model => model.EventDate, 
 new { @class = "form-control input-lg", @type = "date" }, 
 Model.IsEditorReadOnly)

И все метаданные свойств модели появятся для первого экземпляра, который вызывается на странице. Получающийся html будет выглядеть так:

licensed under cc by-sa 3.0 with attribution.