2013-03-29 131 views
6

的一个子集我有一个包含3个不同的部分,看起来像这样的形式:验证摘要领域

<form action="/Submit/" method="POST"> 
    <h2> 
     Your Info: 
    </h2> 
    <ul> 
     <li> 
      <label> 
       First Name: 
       @Html.TextBoxFor(m => m.FirstName) 
      </label> 
     </li> 
     <li> 
      <label> 
       Last Name: 
       @Html.TextBoxFor(m => m.LastName) 
      </label> 
     </li> 
    </ul> 
    <h2> 
     Membership: 
    </h2> 
    <ul> 
     <li> 
      <label>@Html.RadioButtonFor(m => m.MembershipLength_Months, 3) 3 Months</label> 
     </li> 
     <li> 
      <label>@Html.RadioButtonFor(m => m.MembershipLength_Months, 12) 12 Months</label> 
     </li> 
    </ul> 
    <h2> 
     Billing Info: 
    </h2> 
    @Html.EditorFor(m=> m.PaymentInfo) 
    <input type="submit" value="Submit" /> 
</form> 

我想要做的是让每部分的摘要。我知道我可以做这样的事情每个H2下:

@if (ViewData.ModelState.Keys.Contains("FirstName") || ViewData.ModelState.Keys.Contains("LastName")) 
{ 
    <div> 
     summary text 
     @Html.ValidationMessageFor(m => m.FirstName) 
     @Html.ValidationMessageFor(m => m.LastName) 
    </div> 
} 

但感觉应该有一个清晰的解决方案。谷歌已经完全失败了我,我一直无法找到一个自定义助手或验证摘要扩展,它需要一个集合来表示要汇总的属性。

每个部分都包含很多字段,因此ModelState.Keys比较会很快变得非常难看。有没有一种干净的方式来做到这一点?

回答

4

但它感觉应该有一个更清洁的解决方案。

是的,你可以写一个自定义的,可重复使用的HTML帮助实现这一任务:

public static class HtmlExtensions 
{ 
    public static IHtmlString Summary<TModel>(
     this HtmlHelper<TModel> html, 
     params Expression<Func<TModel, object>>[] expressions 
    ) 
    { 
     var div = new TagBuilder("div"); 
     var sb = new StringBuilder(); 
     foreach (var expression in expressions) 
     { 
      var unary = expression.Body as UnaryExpression; 
      if (unary != null && unary.NodeType == ExpressionType.Convert) 
      { 
       var lambda = Expression.Lambda(unary.Operand, expression.Parameters);      
       sb.AppendLine(html.ValidationMessage(ExpressionHelper.GetExpressionText(lambda)).ToHtmlString()); 
      } 
      else 
      { 
       sb.AppendLine(html.ValidationMessageFor(expression).ToHtmlString()); 
      } 
     } 
     div.InnerHtml = sb.ToString(); 
     return new HtmlString(div.ToString()); 
    } 
} 

可能这样使用:

<h2> 
    Your Info: 
    @Html.Summary(
     x => x.FirstName, 
     x => x.LastName 
    ) 
</h2> 

助手可以让你列出任何您想要包含在摘要中的属性作为验证错误。

+0

这几乎是我正在寻找的。谢谢。 –