ASP.NET MVC Html.ValidationSummary (true) no muestra errores de modelo

194

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

MembersManager.RegisterMember(member);

la sección catch agrega un error a 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 quiero mostrar 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);
    }
}

Ver:

<% 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)%>
<% } %>
msi
fuente

Respuestas:

324

Creo que la forma en que funciona el indicador ValidationSummary es que solo mostrará ModelErrors string.emptycomo la clave. De lo contrario, se supone que es un error de propiedad. El error personalizado que está agregando tiene la clave 'error', por lo que no se mostrará cuando llame a ValidationSummary (verdadero). Debe agregar su mensaje de error personalizado con una clave vacía como esta:

ModelState.AddModelError(string.Empty, ex.Message);
Pinchazo
fuente
9
@LordCover: Supongo que esto "funciona según lo diseñado" 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 deja que esos errores estén representados por llamadas Html.ValidationMessageFor () para cada propiedad individual sin que se dupliquen en el resumen. En mente, parece que cualquier error de modelo agregado con una clave no vacía se supone que está asociado con una propiedad de modelo, incluso si la clave no coincide con el nombre de una propiedad.
Daniel Schaffer
26
Solo una nota para otros implementadores: ModelState.AddModelError(string.Empty, ex);tampoco parece funcionar. Debe usar la ModelState.AddModelError(string, string)sobrecarga como se muestra arriba.
wolfyuk
2
actualización: en MVC4 este ya no parece ser el caso. ModelState.AddModelError ("", ex.Message); funciona
Neil Thompson
44
MVC5 Todavía necesitaba llamar al ex.Mensaje para que funcione.
smiggleworth
¡salvó el día! MVC5 todavía tiene algunos problemas :)
juFo
67

Esto funciona mejor, ya que puede mostrar validationMessage para una clave específica:

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

y mostrarlo así:

    @Html.ValidationMessage("keyName")
ingvesund
fuente
28

Sé que esto es algo antiguo y se ha marcado como respuestas con 147 votos, pero hay algo más que considerar.

Puede tener todos los errores del modelo, la propiedad nombrada y la cadena. Las claves vacías por igual, se mostrarán en ValidationSummary si es necesario. Hay una sobrecarga en 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);

ingrese la descripción de la imagen aquí

Levitikon
fuente
55
¡Si! Simplemente cambie @Html.ValidationSummary(true, "", new { @class = "text-danger" })a@Html.ValidationSummary(false, "", new { @class = "text-danger" })
Xeningem
7

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

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

O

<div class="alert alert-danger">
  @Html.ValidationSummary(false)
</div>
Piotr Knut
fuente
5
@Html.ValidationSummary(false,"", new { @class = "text-danger" })

Usar esta línea puede ser útil

Sachind
fuente
Agregue la línea anterior en el archivo cshtml.
sachind
2

En mi caso no estaba funcionando debido a la devolución.

En lugar de usar:

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

Solía:

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

Es un modelo, por lo que es obvio que ModelState.AddModelError("keyName","Message");debe funcionar con un modelo.

Esta respuesta muestra por qué. Agregar validación con DataAnnotations

Allan Patrick Patzlaff
fuente
0

Si casi todo parece correcto, otra cosa a tener en cuenta es asegurarse de que el resumen de validación no se oculte explícitamente mediante alguna anulación de CSS como esta:

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

Esto también puede hacer @Html.ValidationSummaryque aparezca oculto, ya que el resumen se representa dinámicamente con la validation-summary-validclase.

alex
fuente
0

Puedes probar,

<div asp-validation-summary="All" class="text-danger"></div>
Adrita Sharma
fuente
nota: esto tiene que ser un <div>, si es un <span> no se representará.
Stephen Angell el
-4

AGREGAR en la parte inferior de su vista:

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

ronIT
fuente