2013-03-29 10 views
6

Ho una forma che contiene 3 sezioni distinte che sembra qualcosa di simile:sintesi di convalida per un sottoinsieme di campi

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

Quello che mi piacerebbe fare è di avere un riepilogo per sezione. So che potrei fare qualcosa di simile sotto ogni 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> 
} 

Ma sembra che ci dovrebbe essere una soluzione più pulita. Google mi ha completamente fallito e non sono stato in grado di trovare un helper personalizzato o un'estensione di riepilogo di convalida che accetta una raccolta per rappresentare le proprietà da riepilogare.

Ciascuna sezione contiene un buon numero di campi in modo che il confronto ModelState.Keys diventi piuttosto brutto abbastanza rapidamente. C'è un modo pulito per farlo?

risposta

4

Ma sembra che ci dovrebbe essere una soluzione più pulita.

Sì, si potrebbe scrivere una consuetudine, riutilizzabile helper HTML per realizzare questo compito:

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

che potrebbe essere utilizzato come quella:

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

L'helper permette di elencare qualsiasi proprietà che si desidera includere nel riepilogo come errori di convalida.

+0

Questo è praticamente esattamente quello che stavo cercando. Grazie. –

Problemi correlati