如何使用html助手和asp.net mvc中的自定义显示视图在条件下创建只读

本文关键字:显示 自定义 视图 只读 创建 条件下 mvc html 何使用 net asp | 更新日期: 2023-09-27 18:16:33

1。例如,我有下一个助手,我需要设置状态为只读(或禁用(

@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";
    }
}

2.我有模型的自定义视图:-

@Html.DisplayFor(model => model.RequestType, new { **@readonly = IsReadOnly(Model.IsClosed)** })

仅当显式指定或未指定readonly(或disabled(时才有效。自定义助手不适合

如何使用html助手和asp.net mvc中的自定义显示视图在条件下创建只读

为什么不能这样做:

@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;
}