2013-03-29 18 views
6

Mam formularz, który zawiera 3 odrębne sekcje, które wygląda mniej więcej tak:podsumowanie Validation dla podzbioru pól

<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> 

Co chciałbym zrobić, to mieć podsumowanie od sekcji. Wiem, że mogłem zrobić coś takiego pod każdym 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> 
} 

Ale wydaje się, że powinno być czystsze rozwiązanie. Google całkowicie mnie zawiódł i nie udało mi się znaleźć niestandardowego pomocnika ani rozszerzenia podsumowania sprawdzania poprawności, które pobiera kolekcję w celu reprezentowania właściwości do podsumowania.

Każda z sekcji zawiera dużą liczbę pól, więc porównanie z modelem ModelState.Keys jest dość brzydkie dość szybko. Czy jest to czysty sposób na zrobienie tego?

Odpowiedz

4

Ale wydaje się, że powinno być czystsze rozwiązanie.

Tak, można napisać zwyczaj, wielokrotnego użytku HTML pomocnika do osiągnięcia tego zadania:

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()); 
    } 
} 

które mogłyby zostać wykorzystane tak:

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

Pomocnik pozwala notować każdy właściwości, które chcesz uwzględnić w podsumowaniu jako błędy sprawdzania poprawności.

+0

To jest dokładnie to, czego szukałem. Dzięki. –