Saltar al contenido

Cómo personalizar Html.ValidationMessageFor en ASP MVC

Solución:

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

Algo en esta línea (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 ponerlo 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 puede ver, esto usa default ValidationMessageFor método, para no interferir con el procesamiento del mensaje de error del complemento de validación.

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

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

Usé otra forma:

    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 la forma incorporada, pero reemplace el intervalo con un div.

Si necesita otras sobrecargas de la función, simplemente duplique según sea necesario.

Puede implementar su propio ValidationMessageFor helper para emitir su salida deseada o usar algo de javascript para agregar / modificar el código HTML renderizado, pero la implementación personalizada ValidationMessageFor es el enfoque más limpio en mi humilde opinión.

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

Sugerencias de implementación

Dado que GetFormContextForClientValidation es interno, debe solucionar 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, también necesitaría duplicar ese código. Lo que puede hacer para evitar la duplicación de código es permitir que ValidationExtentensions.ValidationMessageFor represente la cadena del mensaje de validación que está envuelta en un intervalo y luego cambie la cadena renderizada de acuerdo con sus requisitos. Tenga en cuenta que se devuelve “nulo” en caso de que no se encuentre ningún error y que necesitará los atributos HTML de datos en caso de que tenga habilitado JavaScript discreto.

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *