Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何编写自定义ASP.NET MVC HTML帮助程序(如HTML.TextBoxFor)并设置正确的名称属性_C#_Asp.net Mvc - Fatal编程技术网

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
    }