new - ASP.NET MVC Html.ValidationSummary(true) no muestra errores de modelo
que es validationsummary (7)
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 al 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);
}
}
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)%>
<% } %>
AGREGARLO en la parte más inferior de su Vista:
@Section Scripts {@ Scripts.Render ("~ / bundles / jqueryval")}
Creo que la forma en que funciona el indicador ValidationSummary es que solo mostrará 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);
En mi caso, no funcionaba 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 trabajar con un modelo.
Esta respuesta muestra por qué. Agregar validación con DataAnnotations
Esto funciona mejor, ya que puede mostrar validationMessage para una clave específica:
ModelState.AddModelError("keyName","Message");
y mostrarlo así:
@Html.ValidationMessage("keyName")
Sé que esto es algo viejo y ha sido marcado como respuestas con 147 votos al alza, pero hay algo más que considerar.
Puede hacer que todos los errores del modelo, la propiedad nombrada y la cadena. Claves vacías por igual, se muestren en el Resumen de validación, 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);
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 una anulación de CSS como esta:
.validation-summary-valid {
display: none;
}
Esto también puede hacer que @Html.ValidationSummary
aparezca oculto, ya que el resumen se representa dinámicamente con la clase validation-summary-valid
.
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>