C# 如何在asp.net mvc中使用html helper和自定义displayview在条件下创建只读?
一,。例如,我有下一个助手,我需要设置状态为只读或禁用C# 如何在asp.net mvc中使用html helper和自定义displayview在条件下创建只读?,c#,asp.net-mvc,asp.net-mvc-4,html-helper,C#,Asp.net Mvc,Asp.net Mvc 4,Html Helper,一,。例如,我有下一个助手,我需要设置状态为只读或禁用 @Html.TextBoxFor(model => model.RequestTypeAdditional, new { @class = "form-control", @autocomplete = "off" , **readonly = IsReadOnly(Model.IsClosed)** }) @functions { private static string IsReadOnly( bool isCl
@Html.TextBoxFor(model => model.RequestTypeAdditional, new { @class = "form-control", @autocomplete = "off" , **readonly = IsReadOnly(Model.IsClosed)** })
@functions
{
private static string IsReadOnly( bool isClosed)
{
if (RoleHelpers.IsInRoles("Master"))
return "readonly";
else if (RoleHelpers.IsInRoles("Operator") && (!isClosed))
return string.Empty;
else if (RoleHelpers.IsInRoles("Operator") && (isClosed))
return "readonly";
else if (RoleHelpers.IsInRoles("Administrator"))
return string.Empty;
else
return "readonly";
}
}
二,。我有模型的自定义视图:-
@Html.DisplayFor(model => model.RequestType, new { **@readonly = IsReadOnly(Model.IsClosed)** })
仅当明确指定或未指定readonly或disabled时有效。自定义帮助程序不适用为什么不能这样做:
@if (IsReadOnly(Model.IsClosed))
{
@Html.TextBoxFor(model => model.RequestType, new { @readonly = "readonly" })
}
else
{
@Html.TextBoxFor(model => model.RequestType)
}
不要用蛮力来对付它。我同意你不希望你的表单代码有多个重复块
我建议使用上面Sergey Shabanov建议的代码,并将其放入显示模板中。然后在模型中使用UIHint链接到显示模板。Presto,代码完整,表单代码中没有膨胀。您可以保留DisplayFor,通常它解析为一行UI代码。最后,将实现保存在一个位置,这样更改它就不容易出错。我还认为这可能是实现强类型TextBox自定义帮助程序的最佳方法之一:
public static MvcHtmlString TextBoxFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>>expression, bool isReadonly, bool isAutocomplete)
{
MvcHtmlString html = default(MvcHtmlString);
if (isReadonly)
{
html = System.Web.Mvc.Html.InputExtensions.TextBoxFor(htmlHelper, expression, new { @class = "readOnly form-control", @autocomplete = isAutocomplete ? "on" : "off", @readonly = "read-only" });
}
else
{
html = System.Web.Mvc.Html.InputExtensions.TextBoxFor(htmlHelper, expression, new { @class = "readOnly form-control", @autocomplete = isAutocomplete ? "on" : "off" });
}
return html;
}
这不会影响你的状态。最后,您将拥有一个控件。如果控件中有readonly属性,则它将呈现为只读文本框。