2013-03-29 129 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

這幾乎是我正在尋找的。謝謝。 –