2013-03-29 3 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> 
} 

Но похоже, что должно быть более чистое решение. Google полностью провалил меня, и я не смог найти вспомогательное вспомогательное или валидационное резюме, которое берет коллекцию для представления обобщаемых свойств.

Каждый из разделов содержит большое количество полей, поэтому сравнение 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

Это почти точно, что я искал. Благодарю. –

Смежные вопросы