При использовании Помощника HTML, что лучший метод должен установить атрибут на основе условия. Например,
<%if (Page.User.IsInRole("administrator")) {%>
<%=Html.TextBoxFor(m => m.FirstName, new {@class='contactDetails'}%>
<%} else {%>
<%=Html.TextBoxFor(m => m.FirstName, new {@class='contactDetails', disabled = true}%>
<%}%>
Должен быть лучший способ программно добавить всего один дополнительный KeyPair к анонимному типу? Не может использовать
new { .... disabled = Page.User.IsInRole("administrator") ... }
поскольку браузер берет любое отключенное значение атрибута в качестве создания отключенного входа
Я мог бы предложить вам использовать mvccontrib.FluentHtml.
Вы можете сделать что-то вроде этого
<%=this.TextBox(m=>m.FirstNam ).Disabled(Page.User.IsInRole("administrator"))%>
Page.User.IsInRole ("администратор")? null: new {disabled = "disabled"}
Использование предложения @SLaks для использования метода расширения и использование примера метода расширения Джереми Кларка Я написал метод расширения, поэтому я теперь можно сделать
Html.TextBoxFor(m => m.FirstName,new{class='contactDetails', ...},Page.User.IsInRole("administrator"));
Не уверен, есть ли лучший метод
public static class InputExtensions
{
public static IDictionary<string, object> TurnObjectIntoDictionary(object data)
{
var attr = BindingFlags.Public | BindingFlags.Instance;
var dict = new Dictionary<string, object>();
if (data == null)
return dict;
foreach (var property in data.GetType().GetProperties(attr))
{
if (property.CanRead)
{
dict.Add(property.Name, property.GetValue(data, null));
}
}
return dict;
}
public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes, bool disabled)
{
IDictionary<string, object> values = TurnObjectIntoDictionary(htmlAttributes);
if (disabled)
values.Add("disabled","true");
return htmlHelper.TextBoxFor(expression, values);
}
public static MvcHtmlString TextAreaFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes, bool disabled)
{
IDictionary<string, object> values = TurnObjectIntoDictionary(htmlAttributes);
if (disabled)
values.Add("disabled", "true");
return htmlHelper.TextAreaFor(expression, values);
}
public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool>> expression, object htmlAttributes, bool disabled)
{
IDictionary<string, object> values = TurnObjectIntoDictionary(htmlAttributes);
if (disabled)
values.Add("disabled", "true");
return htmlHelper.CheckBoxFor(expression, values);
}
}
Вы также можете определить этот параметр таким образом:
Page.User.IsInRole("administrator")
? (object)new { @class='contactDetails'}
: (object)new { @class='contactDetails', disabled = true}
Вы можете рассмотреть возможность написания собственного класса HtmlHelper Extension с новым методом TextBox:
public static class HtmlHelperExtensions
{
public static MvcHtmlString TextBoxFor(this HtmlHelper htmlHelper, Expression<Func<TModel, TProperty>> expression, string cssClass, bool disabled)
{
return disabled
? Html.TextBoxFor(expression, new {@class=cssClass, disabled="disabled"})
: Html.TextBoxFor(expression, new {@class=cssClass})
}
}
теперь (если этот новый класс находится в том же пространстве имен, или вы импортировали новое пространство имен в заголовок вашей страницы, или в раздел pages в web. config) вы можете сделать это на вашей aspx странице:
<%=Html.TextBoxFor(m => m.FirstName, "contactDetails", Page.User.IsInRole("administrator")) %>
Вам нужно будет передать Dictionary
и добавить ключ disabled
внутри оператора if
.
Я рекомендую сделать перегрузку метода расширения, который принимает параметр bool disabled
и добавляет его в RouteValueDictionary
, созданный из параметра атрибутов, если он истина
. (Вы также можете удалить запись disabled
из RouteValueDictionary
, если она false
, и не принимать другой параметр)