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)
你可以使用这样的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().
| 归档时间: |
|
| 查看次数: |
13763 次 |
| 最近记录: |