2011-11-11 30 views
0

我有一个模型,我正在使用从数据库中呈现模型的索引,并给出了一些可能需要空间的行的显示名称(即“数据库中的”weekstarting“将被给予显示“星期开始”的名称)。与@ Html.LabelFor和W3C Validator冲突?

所以我为我的模型是这样设置的显示名称:

[DisplayName("Week Starting")] 
    public DateTime WeekStarting { get; set; } 

,然后在我的表我用下面的代码行中使用其给定的显示名称显示的字段名称的表头:

@Html.LabelFor(x => x.First().WeekStarting) 

以上所有工作正常。但我使用的是W3C验证程序,它给了我给出的例子,我给了以下错误:

标签元素的for属性必须引用窗体控件。

原谅我,如果这是显而易见的,但我在这里做错了什么?我没有使用表格,我只是在表格中显示项目索引。我试图寻找答案,并看到有人建议表单控件被引用需要id(即使我没有使用表单),但这不适用于这种情况,因为如果我试图设置一个id在它将与每个项目在索引中被复制的指数:

foreach (var item in Model.Tbms) 
{ 
<tr><td>@item.value</td><tr>.... would be repeated for each item, and also unsure where I would put the id in any case, the td? 
} 

还是有更好的方式来标记字段标题,我的首选显示的名字摆在首位?我想我可以交换@ Html.LabelFor ...为硬代码字段名称,但我必须?

回答

1

它插入一个label元素,它应该对应于页面上的有效输入。您可以(a)不用担心,(b)直接输出文本而不使用LabelFor,(c)编写一个自定义帮助程序,从模型中提取标签文本,而不将其包装在label中,或者(d)打开它与客户端上的JavaScript(这将使其通过验证,但只有在运行脚本后)。

下面是一个基于LabelFor代码的扩展,它应该有助于(c)。未经测试。

public static class HelperExtensions 
{ 
     public static MvcHtmlString TableHeaderFor<TModel,TValue)(this HtmlHelper<TModel> html, Expression<Func<TModel,TValue>> expression) 
     { 
      var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); 
      string headerText = metadata.DisplayName ?? metadata.PropertyName ?? ExpressionHelper.GetExpressionText(expression); 
      return new MvcHtmlString(headerText); 
     } 
} 
+0

感谢tvanfosson,会给它一个尝试 – DevDave

+1

请注意,如果你想要的话,你可以让它实际生成'TH',我想这个名字会更加合适。在这种情况下,您只需使用TagBuilder构造'TH'并添加'headerText'作为标记的InnerText。不过,签名可能需要更改为接受HTML属性,然后您必须添加代码来处理它们。请参阅http://codeplex.com/aspnet上的MVC源代码,了解如何使其工作。 – tvanfosson

1

难道仅仅是一个案件的问题?您的线路:

@Html.LabelFor(x => x.First().Weekstarting) 

包含'Weekstarting',而实际属性称为'WeekStarting'。

+0

不抱歉,我没有把错误的代码放到这里。虽然发现了! +1! – DevDave