2010-05-12 37 views
174

Tengo algún problema con Html.ValidationSummary. No quiero mostrar errores de propiedad en ValidationSummary. Y cuando configuro Html.ValidationSummary (true) no muestra mensajes de error de ModelState. Cuando hay alguna excepción en la acción del controlador en la cadena deASP.NET MVC Html.ValidationSummary (true) no muestra errores de modelo

MembersManager.RegisterMember(member); 

segmento de retenida añade un error a la ModelState:

ModelState.AddModelError("error", ex.Message); 

Pero ValidationSummary no muestra este mensaje de error. Cuando configuro Html.ValidationSummary (false) se muestran todos los mensajes, pero no deseo mostrar los errores de propiedad. ¿Como puedo solucionar este problema?

Aquí está el código que estoy usando:

Modelo:

public class Member 
{ 
     [Required(ErrorMessage = "*")] 
     [DisplayName("Login:")] 
     public string Login { get; set; } 

     [Required(ErrorMessage = "*")] 
     [DataType(DataType.Password)] 
     [DisplayName("Password:")] 
     public string Password { get; set; } 

     [Required(ErrorMessage = "*")] 
     [DataType(DataType.Password)] 
     [DisplayName("Confirm Password:")] 
     public string ConfirmPassword { get; set; } 
} 

controlador:

[HttpPost] 
public ActionResult Register(Member member) 
{ 
    try 
    { 
     if (!ModelState.IsValid) 
      return View(); 

     MembersManager.RegisterMember(member); 
    } 
    catch (Exception ex) 
    { 
     ModelState.AddModelError("error", ex.Message); 

     return View(member); 
    } 
} 

Vista:

<% using (Html.BeginForm("Register", "Members", FormMethod.Post, 
         new { enctype = "multipart/form-data" })) {%> 
    <p> 
     <%= Html.LabelFor(model => model.Login)%> 
     <%= Html.TextBoxFor(model => model.Login)%> 
     <%= Html.ValidationMessageFor(model => model.Login)%> 
    </p> 

    <p> 
     <%= Html.LabelFor(model => model.Password)%> 
     <%= Html.PasswordFor(model => model.Password)%> 
     <%= Html.ValidationMessageFor(model => model.Password)%> 
    </p> 

    <p> 
     <%= Html.LabelFor(model => model.ConfirmPassword)%> 
     <%= Html.PasswordFor(model => model.ConfirmPassword)%> 
     <%= Html.ValidationMessageFor(model => model.ConfirmPassword)%> 
    </p> 

    <div> 
     <input type="submit" value="Create" /> 
    </div> 

    <%= Html.ValidationSummary(true)%> 
<% } %> 

Respuesta

292

creo que la forma en que el ValidationSummary la bandera funciona, lo hará en muestra los ModelErrors para string.empty como la clave. De lo contrario, se supone que es un error de propiedad. No hay ninguna validación de que la cadena que proporcione sea/no sea una propiedad del Modelo.

ModelState.AddModelError(string.Empty, ex.Message); 
+1

¿Corregieron este problema en MVC3? –

+8

@LordCover: supongo que esto está "funcionando como se diseñó" y no es un error: la sobrecarga de ValidationSummary() utilizada por defecto excluye los errores de ModelState asociados con las propiedades del modelo en sí. Esto hace que esos errores sean representados por llamadas Html.ValidationMessageFor() para cada propiedad individual sin tenerlos duplicados en el resumen. Teniendo eso en cuenta, parece que cualquier error de modelo agregado con una clave no vacía se asume que está asociado con una propiedad del modelo, incluso si la clave no coincide con el nombre de una propiedad. –

+24

Solo una nota para otros implementadores: 'ModelState.AddModelError (string.Empty, ex);' tampoco parece funcionar. Debe usar la sobrecarga 'ModelState.AddModelError (string, string)' como se muestra arriba. – WolfyUK

53

Esto funciona mejor, como se puede demostrar validationMessage para una clave especificada:

ModelState.AddModelError("keyName","Message"); 

y mostrarlo como esto:

@Html.ValidationMessage("keyName") 
+0

Simple. trabajando, la mejor respuesta –

28

Sé que esto es un poco viejo y tiene sido marcados como respuestas con 147 votos al alza, pero hay algo más que considerar.

Puede tener todos los errores de modelo, la propiedad nombrada y string.Empty keys igualmente, se muestran en el ValidationSummary si es necesario. Hay una sobrecarga en el ValidationSummary que hará esto.

// excludePropertyErrors: 
    // true to have the summary display model-level errors only, or false to have 
    // the summary display all errors. 
    public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors); 

enter image description here

+4

¡Sí! Simplemente cambie '@ Html.ValidationSummary (true," ", new {@class =" text-danger "})' to '@ Html.ValidationSummary (false," ", new {@class =" text-danger "}) ' – Xeningem

+0

@ Xeningem esto funciona. ty. – Willmore

0

En mi caso no estaba funcionando debido al retorno.

En lugar de utilizar:

return RedirectToAction("Rescue", "CarteiraEtapaInvestimento", new { id = investimento.Id, idCarteiraEtapaResgate = etapaDoResgate.Id }); 

utilicé:

return View("ViewRescueCarteiraEtapaInvestimento", new CarteiraEtapaInvestimentoRescueViewModel { Investimento = investimento, ValorResgate = investimentoViewModel.ValorResgate }); 

Está un modelo, por lo que es Obvius que ModelState.AddModelError("keyName","Message"); debe trabajar con un modelo.

Esta respuesta muestra por qué. Adding validation with DataAnnotations

5

Tal vez así:

[HttpPost] 
public ActionResult Register(Member member) 
{ 
    try 
    { 
     if (!ModelState.IsValid) 
     { 
      ModelState.AddModelError("keyName", "Form is not valid"); 
      return View(); 
     } 
     MembersManager.RegisterMember(member); 
    } 
    catch (Exception ex) 
    { 
     ModelState.AddModelError("keyName", ex.Message); 
     return View(member); 
    } 
} 

Y en la pantalla Añadir:

<div class="alert alert-danger"> 
    @Html.ValidationMessage("keyName") 
</div> 

O

<div class="alert alert-danger"> 
    @Html.ValidationSummary(false) 
</div> 
-4

añadirlo en la parte más baja og su Vista:

@section Scripts { @ Scripts.Render ("~/paquetes/jqueryval")}

0

Si casi todo parece correcto, otra cosa a tener en cuenta es asegurarse de que el resumen de validación no es se oculta de forma explícita a través de algún CSS anulación de la siguiente manera:

.validation-summary-valid { 
    display: none; 
} 

esto también puede hacer que el @Html.ValidationSummary que aparecerán ocultas, como el resumen se presenta dinámicamente con la clase validation-summary-valid.

Cuestiones relacionadas