C# 如何编写自定义ASP.NET MVC HTML帮助程序(如HTML.TextBoxFor)并设置正确的名称属性
我想要自定义C# 如何编写自定义ASP.NET MVC HTML帮助程序(如HTML.TextBoxFor)并设置正确的名称属性,c#,asp.net-mvc,C#,Asp.net Mvc,我想要自定义Html.DateTimePickerFor(a=>a.Fields[0].Id,value) 所以结果应该是这样的: <div name="Fields[0].Id"></div> 目前我使用Html.DatetimePicker(“Fields[0].Id”,value),它工作得很好,但我希望生成动态名称 所以问题是如何设置正确的“name”属性?试试这样的方法(改编自工作代码): 公共静态IHtmlString日期时间选择器( 这个HtmlHel
Html.DateTimePickerFor(a=>a.Fields[0].Id,value)
所以结果应该是这样的:
<div name="Fields[0].Id"></div>
目前我使用Html.DatetimePicker(“Fields[0].Id”,value)
,它工作得很好,但我希望生成动态名称
所以问题是如何设置正确的“name”
属性?试试这样的方法(改编自工作代码):
公共静态IHtmlString日期时间选择器(
这个HtmlHelper助手,
表情表情,
//其他需要的输入参数
) {
//元数据使您能够访问各种有用的内容,例如
//显示名称和所需状态
var metadata=modelmetada.FromLambdaExpression(表达式,helper.ViewData);
string markup=“;//输入的标记
var name=helper.NameFor(表达式);//获取名称
返回MvcHtmlString.Create(标记);
}
试试这个。它对我有用
public static MvcHtmlString DateTimePickerFor<TModel, TProp>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProp>> expression, object htmlAttributes)
{
string name = ExpressionHelper.GetExpressionText(expression);
... rest of code here
}
public static MvcHtmlString DateTimePickerFor(此HtmlHelper帮助程序、表达式、对象htmlAttributes)
{
字符串名称=ExpressionHelper.GetExpressionText(表达式);
…剩下的代码在这里
}
魔法来自System.Web.Mvc.ExpressionHelper.GetExpressionText()
。从表达式中获得名称后,可以将其应用于div
使用此方法时要小心,因为它忽略了
NameFor()
所做的两件事:1)属性编码和2)名称限定。查看MVC源代码,其中名称通过调用进一步限定:html.ViewData.TemplateInfo.GetFullHtmlFieldName(名称)
Cool!正是我想要的。@TimMedora-这是什么版本的mvc?我在源代码的当前版本中看到了它,但在我从中提取代码片段的MVC3应用程序中,我没有看到该方法。是不是只有MVC4?如果你有一个MVC4应用程序,那么你的解决方案听起来是更好的选择。MVC3 RTM,NameExtensions
class-看到你的答案后,我很好奇它与NameFor()
有什么不同NameFor()
调用GetExpressionText()
并将结果传递给重载,重载返回MvcHtmlString.Create(html.attributencode(html.ViewData.TemplateInfo.GetFullHtmlFieldName(name))
属性编码可能不是什么大问题,但名称限定可能会导致问题。您是否尝试为日期时间字段创建TextBoxFor
版本,或为特定字段创建EditFor
模板?我认为这是目前最重要的因素。
public static MvcHtmlString DateTimePickerFor<TModel, TProp>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProp>> expression, object htmlAttributes)
{
string name = ExpressionHelper.GetExpressionText(expression);
... rest of code here
}