validationmessagefor mvc errormessage change asp.net-mvc asp.net-mvc-3

asp.net-mvc - errormessage - edit mvc c#



Cómo personalizar Html.ValidationMessageFor en ASP MVC (6)

La única necesidad de cambiar la generación de etiquetas predeterminada fue en mi caso, que abarca los resultados de comportamiento en configuraciones de margen molestas.

Resolví esto usando ''display: block''

Tal vez esto ayude a algunas personas ..

¿Es posible personalizar el método Html.ValidationMessageFor para que produzca diferentes HTML?

Quiero hacer algo similar a:

<div class="field-error-box"> <div class="top"></div> <div class="mid"><p>This field is required.</p></div> </div>


No estoy seguro de si es posible usar p aragraph en lugar del span predeterminado, ya que puede hacer imposible que el complemento de validación coloque mensajes de error. Pero para div -s, eso es fácil: podría escribir un ayudante HTML personalizado.

Algo en estas líneas ( puede necesitar más pruebas / codificación ). Deberá incluir el espacio de nombres de este método de extensión estática en su vista, o colocarlo en System.Web.Mvc.Html directamente.

public static class Validator { public static MvcHtmlString MyValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) { TagBuilder containerDivBuilder = new TagBuilder("div"); containerDivBuilder.AddCssClass("field-error-box"); TagBuilder topDivBuilder = new TagBuilder("div"); topDivBuilder.AddCssClass("top"); TagBuilder midDivBuilder = new TagBuilder("div"); midDivBuilder.AddCssClass("mid"); midDivBuilder.InnerHtml = helper.ValidationMessageFor(expression).ToString(); containerDivBuilder.InnerHtml += topDivBuilder.ToString(TagRenderMode.Normal); containerDivBuilder.InnerHtml += midDivBuilder.ToString(TagRenderMode.Normal); return MvcHtmlString.Create(containerDivBuilder.ToString(TagRenderMode.Normal)); } }

Como ve, esto utiliza el método ValidationMessageFor predeterminado, para no interferir con el procesamiento de los mensajes de error del complemento de validación.

Y usas esto simplemente, como ayudante de mensaje de validación predeterminado

@Html.MyValidationMessageFor(model => model.SomeRequiredField)


Puede implementar su propio ayudante de ValidationMessageFor para emitir la salida deseada o usar algún javascript para agregar / modificar el código HTML representado, pero la implementación personalizada de ValidationMessageFor es el método más limpio IMHO.

Para implementar su propio asistente ValidationMessageFor, eche un vistazo a los métodos ValidationExtensions.ValidationMessageFor y ValidationMessageHelper en el código fuente ASP.NET MVC.

Sugerencias de implementación

Ya que GetFormContextForClientValidation es interno, tiene que trabajar en torno a esa implementación duplicando la funcionalidad interna en su código:

FormContext formContext = htmlHelper.ViewContext.ClientValidationEnabled ? htmlHelper.ViewContext.FormContext : null;

Algunos otros métodos son privados en ValidationExtensions como GetUserErrorMessageOrDefault que también necesitaría para duplicar ese código. Lo que puede hacer para evitar la duplicación de código es permitir que ValidationExtentensions.ValidationMessageFor represente la cadena de mensaje de validación que está envuelta en un tramo y luego cambie la cadena representada de acuerdo con sus requisitos. Tenga en cuenta que se devuelve "null" en caso de que no se haya encontrado un error y que necesitará los atributos de datos HTML en caso de que tenga habilitado JavaScript no intrusivo.

Puede descargar el código fuente de ASP.NET MVC 3 desde here


Sí, solo usa un metamodelo para el campo:

[MetadataType(typeof(YourMetaData))] public partial class YOURCLASS { [Bind(Exclude = "objID")] public class YourMetaData { [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter a name")] public object Name { get; set; } } }

Cambie su mensaje en el campo ErrorMessage :) Espero esta ayuda :)


Tal vez puedas poner ese código

string propertyName = ExpressionHelper.GetExpressionText(expression); string name = helper.AttributeEncode(helper.ViewData.TemplateInfo.GetFullHtmlFieldName(propertyName)); if (helper.ViewData.ModelState[name] == null || helper.ViewData.ModelState[name].Errors == null || helper.ViewData.ModelState[name].Errors.Count == 0) { return MvcHtmlString.Empty; }

en la parte superior de la función respondida, para que el div no aparezca en el formulario de carga.


Utilicé otra manera:

public static MvcHtmlString DivValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) { return MvcHtmlString.Create(htmlHelper.ValidationMessageFor(expression).ToString().Replace("span", "div")); }

De esta manera puede usar el modo incorporado, pero reemplace el intervalo con un div.

Si necesita alguna otra sobrecarga de la función, simplemente duplique según sea necesario.