创建自定义Html Helper:MyHelperFor

Kut*_*ith 11 c# asp.net-mvc razor asp.net-mvc-4

我想创建一个可以像使用一样的帮助器

@Html.MyHelperFor(m => m.Name)
Run Code Online (Sandbox Code Playgroud)

这应该返回例如

<span name="Name" data-something="Name"></span>

如果是@Html.MyHelperFor(m => m.MailID) 这应该返回

<span name="MailID" data-something="MailID"></span>

我想,我应该能够在helper方法中访问Property名称来制作这种类型的帮助器.

我怎样才能做到这一点?

mat*_*mmo 21

你可以做类似的事情(以下将采用其他HTML属性).

public static MvcHtmlString MyHelperFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, object htmlAttributes = null)
{
    var data = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
    string propertyName = data.PropertyName;
    TagBuilder span = new TagBuilder("span");
    span.Attributes.Add("name", propertyName);
    span.Attributes.Add("data-something", "something");

    if (htmlAttributes != null)
    {
        var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
        span.MergeAttributes(attributes);
    }

    return new MvcHtmlString(span.ToString());
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该添加在命名空间*System.Web.Mvc.Html*下的静态类中. (3认同)

asy*_*ult 5

你可以使用这样的FromLambaExpression方法ModelMetadata:

namespace System.Web.Mvc.Html
{
    public static class CustomHelpers
    {
        public static MvcHtmlString MyHelperFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
        {
            var metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
            var name = metaData.PropertyName;
            // create your html string, you could defer to DisplayFor to render a span or
            // use the TagBuilder class to create a span and add your attributes to it
            string html = "";
            return new MvcHtmlString(html);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ModelMetadata班是在System.Web.Mvc命名空间.该FromLambdaExpression方法是内置帮助程序使用的方法,因此您可以确保您的帮助程序的功能与内置帮助程序相同.通过将CustomHelpers类放在System.Web.Mvc.Html命名空间中,您可以像访问其他帮助程序一样访问您的帮助程序,即@Html.MyHelperFor().