2011-11-16 8 views
8

Quando si verifica un errore sul back-end, il controller MVC restituisce un messaggio tramite il
ModelState.AddModelError("", "message");MVC3 - passando NEW-LINE per ModelState.AddModelError

mi piacerebbe avere quel display 'messaggio' in 2 linee, quindi vorrei mettere un "\r\n"
o un "<br />" in mezzo.

sto usando Razor per visualizzare il messaggio utilizzando @Html.ValidationSummary();
ma l'output HTML dal View mostra che, come &lt;br/&gt;

Qual è il modo migliore per passare New-linee su un messaggio e farlo interpretato in un vero tag
a livello di output HTML?

================================
codice Controller:

ModelState.AddModelError("", "Line one <br /> Line two."); 
return Request.IsAjaxRequest() ? (ActionResult) PartialView("ViewName", model) 
      : View(model); 

Vista codice:

@using (Ajax.BeginForm("Index", "Home", new AjaxOptions { UpdateTargetId = "tv" })) 
{ 
    @if (Html.ValidationSummary() != null) 
     @Html.Raw(Server.HtmlDecode(Html.ValidationSummary(true).ToString())) 

    .... 
} 
+0

Si prega di fornire informazioni, che cosa si vuole fare? – dknaack

+0

L'helper ValidationSummary codifica automaticamente il messaggio in HTML. Dovrai scrivere un helper personalizzato se vuoi raggiungerlo. –

+0

@dknaack ... aggiornato. –

risposta

15

L'HTML helper ValidationSummary codifica i messaggi di errore e questo è di progettazione. Significa che non puoi usare i tag HTML perché saranno codificati. Così si potrebbe scrivere un aiuto personalizzato, che non codifica:

public static class ValidationExtensions 
{ 
    public static IHtmlString MyValidationSummary(this HtmlHelper htmlHelper) 
    { 
     var formContextForClientValidation = htmlHelper.ViewContext.ClientValidationEnabled ? htmlHelper.ViewContext.FormContext : null; 
     if (htmlHelper.ViewData.ModelState.IsValid) 
     { 
      if (formContextForClientValidation == null) 
      { 
       return null; 
      } 
      if (htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled) 
      { 
       return null; 
      } 
     } 

     var stringBuilder = new StringBuilder(); 
     var ulBuilder = new TagBuilder("ul"); 

     ModelState modelState; 
     if (htmlHelper.ViewData.ModelState.TryGetValue(htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix, out modelState)) 
     { 
      foreach (ModelError error in modelState.Errors) 
      { 
       string userErrorMessageOrDefault = error.ErrorMessage; 
       if (!string.IsNullOrEmpty(userErrorMessageOrDefault)) 
       { 
        var liBuilder = new TagBuilder("li"); 
        liBuilder.InnerHtml = userErrorMessageOrDefault; 
        stringBuilder.AppendLine(liBuilder.ToString(TagRenderMode.Normal)); 
       } 
      } 
     } 

     if (stringBuilder.Length == 0) 
     { 
      stringBuilder.AppendLine("<li style=\"display:none\"></li>"); 
     } 
     ulBuilder.InnerHtml = stringBuilder.ToString(); 

     TagBuilder divBuilder = new TagBuilder("div"); 
     divBuilder.AddCssClass(htmlHelper.ViewData.ModelState.IsValid ? HtmlHelper.ValidationSummaryValidCssClassName : HtmlHelper.ValidationSummaryCssClassName); 
     divBuilder.InnerHtml = ulBuilder.ToString(TagRenderMode.Normal); 
     if (formContextForClientValidation != null) 
     { 
      if (!htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled) 
      { 
       divBuilder.GenerateId("validationSummary"); 
       formContextForClientValidation.ValidationSummaryId = divBuilder.Attributes["id"]; 
       formContextForClientValidation.ReplaceValidationSummary = false; 
      } 
     } 
     return new HtmlString(divBuilder.ToString(TagRenderMode.Normal)); 
    } 
} 

e poi:

@Html.MyValidationSummary() 

E 'la seguente riga nel nostro aiuto personalizzato che non fa esplicitamente codificare HTML:

liBuilder.InnerHtml = userErrorMessageOrDefault; 

Nel Prepara originale sembra che questo:

liBuilder.SetInnerText(userErrorMessageOrDefault); 
+0

Grazie Darin ... molto preciso e prezioso risposta !!! –

+0

Se ricevessi $ ogni volta che una delle tue risposte mi ha aiutato a uscire da Darin, non avrei funzionato in questo momento. – Chris

+0

B E Un utero! Grazie, Darin. –

8

Prova avvolgendo il riepilogo di convalida in un Html.Raw e un Server.HtmlDecode, in questo modo:

@Html.Raw(Server.HtmlDecode(Html.ValidationSummary().ToString())) 
+0

Quando inserisco quella riga di codice, non mostra nemmeno la vista parziale. Mi dà un "500 errore interno del server". –

+0

Ho rivisto la mia risposta. Ho testato il codice revisionato e ho restituito il messaggio di errore con un'interruzione di riga quando avevo il '
' nel messaggio di errore. – counsellorben

+0

Il problema è con @ Html.ValidationSummary; Ho provato a sostituirlo con ViewBag.Temp .. e ha funzionato. Quindi abbiamo bisogno di scoprire come far funzionare ValidationSummary prima di iniziare a pensare di sostituirlo totalmente. –

1

Questa è una risposta tardiva, tuttavia questo è il risultato migliore quando ho Google, quindi la mia soluzione potrebbe aiutare qualcuno.

Ho aggirato il problema e aggiunto una riga separata per ogni riga di messaggio di errore. Visualizza magnificamente.

Controller cod:

public ActionResult Edit(EditModel model) 
    { 
      try 
      { 
       //... do update 
      } 
      catch (Exception ex) 
      { 
       if (ex.Message.Contains(Environment.NewLine)) 
       { 
        var messages = ex.Message.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); 
        foreach (var message in messages) 
        { 
         this.ModelState.AddModelError(string.Empty, message); 
        } 
       } 
       else 
       { 
        this.ModelState.AddModelError(string.Empty, ex.Message); 
       } 
      } 
     //... 

     return this.View(model); 
    } 
0

Controller:

ModelState.AddModelError("MyError", "Line 1" + Environment.NewLine + "Line 2"); 

Razor:

<span style="white-space: pre-line">@Html.ValidationSummary()</span> 
+0

inserendo Environment.NewLine come proposto qui, non ha funzionato per me. – levteck

+0

@levteck Qualche idea sul perché avrebbe funzionato per me e non per te? – ADH