使用HTML Helper时,根据条件设置属性的最佳方法是什么。例如
<%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") ... }
因为浏览器将任何禁用的属性值视为禁用输入
答案 0 :(得分:14)
我建议你使用mvccontrib.FluentHtml。
你可以做这样的事情
<%=this.TextBox(m=>m.FirstNam ).Disabled(Page.User.IsInRole("administrator"))%>
答案 1 :(得分:13)
它对我也有用......
<%: Html.DropDownList("SportID", (SelectList)ViewData["SportsSelectList"], "-- Select --", new { @disabled = "disabled", @readonly = "readonly" })%>
<%= Html.CheckBoxFor(model => model.IsActive, new { @disabled = "disabled", @readonly = "readonly" })%>
答案 2 :(得分:8)
Page.User.IsInRole(“管理员”)? null:new {disabled =“disabled”}
答案 3 :(得分:4)
使用@SLaks建议使用Extension方法,并使用Jeremiah Clark's example Extension method我已经编写了一个扩展方法,所以我现在可以做
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);
}
}
答案 4 :(得分:2)
您需要传递Dictionary<string, object>
,并在disabled
语句中添加if
密钥。
我建议对带有bool disabled
参数的扩展方法进行重载,并将其添加到从属性参数创建的RouteValueDictionary
中,如果它是true
。 (您也可以从disabled
RouteValueDictionary
中移除false
条目,如果它是{{1}},则不删除其他参数
答案 5 :(得分:1)
你也可以这样定义这个参数:
Page.User.IsInRole("administrator")
? (object)new { @class='contactDetails'}
: (object)new { @class='contactDetails', disabled = true}
答案 6 :(得分:1)
您可能需要考虑使用新的TextBox方法编写自己的HtmlHelper Extension类:
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})
}
}
现在(如果这个新类在同一名称空间中,或者您已将新名称空间导入页眉,或者在web.config的pages部分中),则可以在aspx页面上执行此操作:
<%=Html.TextBoxFor(m => m.FirstName, "contactDetails", Page.User.IsInRole("administrator")) %>
答案 7 :(得分:1)
在Object上创建一个扩展方法,它将创建输入对象的副本,不包括任何null属性,并将其全部作为字典返回,以便在MVC HtmlHelpers中轻松使用:
public static Dictionary<string, object> StripAnonymousNulls(this object attributes)
{
var ret = new Dictionary<string, object>();
foreach (var prop in attributes.GetType().GetProperties())
{
var val = prop.GetValue(attributes, null);
if (val != null)
ret.Add(prop.Name, val);
}
return ret;
}
不确定两次反映属性的性能影响,并且不太喜欢扩展方法的名称,但似乎做得很好......
new {
@class = "contactDetails",
disabled = Page.User.IsInRole("administrator") ? "true" : null
}.StripAnonymousNulls()