用于自定义助手的MVC编辑器

本文关键字:MVC 编辑器 自定义 用于 | 更新日期: 2023-09-27 18:18:14

我正在尝试为EditorFor创建一个自定义助手。我想从模型中获取字符串长度,并将其添加到html属性中。

到目前为止,我有以下内容,但这并不适用于添加的新属性。
    public static IHtmlString MyEditorFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, object ViewData, bool disabled = false, bool visible = true)
    {
        var member = expression.Body as MemberExpression;
        var stringLength = member.Member.GetCustomAttributes(typeof(StringLengthAttribute), false).FirstOrDefault() as StringLengthAttribute;
        RouteValueDictionary viewData =  HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData);
        RouteValueDictionary htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(viewData["htmlAttributes"]);
        if (stringLength != null)
        {
            htmlAttributes.Add("maxlength", stringLength.MaximumLength);
        }
        return htmlHelper.EditorFor(expression, ViewData);
    }

用于自定义助手的MVC编辑器

您在方法参数中返回原始ViewData属性,而不是在return htmlHelper.EditorFor(expression, ViewData)上自定义HTML属性集合。根据这个答案,您的返回方法应该更改为:

public static IHtmlString MyEditorFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, object ViewData, bool disabled = false, bool visible = true)
{
    var member = expression.Body as MemberExpression;
    var stringLength = member.Member.GetCustomAttributes(typeof(StringLengthAttribute), false).FirstOrDefault() as StringLengthAttribute;
    RouteValueDictionary viewData =  HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData);
    RouteValueDictionary htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(viewData["htmlAttributes"]);
    if (stringLength != null)
    {
        htmlAttributes.Add("maxlength", stringLength.MaximumLength);
    }
    return htmlHelper.EditorFor(expression, htmlAttributes); // use custom HTML attributes here
}

然后,在视图侧应用自定义HTML帮助器,如下所示:

@Html.MyEditorFor(model => model.Property, new { htmlAttributes = new { @maxlength = "10" }})

编辑:

此方法适用于MVC 5(5.1)及以上,我不能确定它在早期版本中是否有效(请参阅此问题:ASP中的EditorFor()的Html属性。净MVC)。

对于早期的MVC版本,HtmlHelper.TextBoxFor的使用更受欢迎,它当然有maxlength属性:

return htmlHelper.TextBoxFor(expression, htmlAttributes);

额外的引用:

设置class属性为Html。编辑器在ASP。. MVC Razor视图

HTML。编辑器用于添加不工作的类