2011-12-05 18 views

Respuesta

24

No estoy seguro si es posible utilizar p aragraph en lugar de span predeterminado, ya que puede hacer imposible val Complemento de idation para colocar mensajes de error. Pero para div -s, eso es fácil, podrías escribir html helper personalizado.

Algo en esta línea (puede necesitar más pruebas/codificación). Deberá incluir el espacio de nombre 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 se ve, este método por defecto utiliza ValidationMessageFor, para no interferir con el procesamiento de mensajes de error de validación-plugin.

Y utiliza este simplemente, como la validación por defecto ayudante mensaje

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

Esto es justo lo que estaba buscando. Todavía no entiendo el problema con el complemento de validación, pero investigaré eso. ¡Gracias! – parleer

+3

Esto funcionó bien para mí, pero asegúrese de declarar su clase de ayuda estática en el espacio de nombres System.Web.Mvc.Html y funcionará muy bien. –

+1

¿Cómo se cambia el html generado por el mensaje 'ValidationMessageFor'? No estoy hablando de envolverlo en otro div. ¿Es posible? –

-2

Sí, sólo tiene que utilizar 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; } 
    } 
} 

cambiar el mensaje en el campo ErrorMessage :) Esperanza esta ayuda:)

+0

Él quiere html personalizado, no el mensaje de error personalizado – archil

+0

opps, supongo que entiendo equivocadamente – shennyL

3

Usted puede implementar su propio ayudante ValidationMessageFor para emitir su salida deseada o utilizar algún javascript para añadir/modificar el código HTML representado pero la costumbre ValidationMessageFor la implementación es el enfoque más limpio en mi humilde opinión.

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

Implementación Hints

Desde GetFormContextForClientValidation es interno que tiene que evitar que la aplicación mediante la duplicación de la funcionalidad interna en el código:

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

Algunos otros métodos son privadas en ValidationExtensions como GetUserErrorMessageOrDefault lo haría Necesito duplicar ese código también. Lo que puede hacer para evitar la duplicación del código es dejar que ValidationExtentensions.ValidationMessageFor represente la cadena del mensaje de validación que se envuelve en un lapso y luego cambie la cadena procesada según sus requisitos. Tenga en cuenta que se devuelve "nulo" en caso de que no se haya encontrado ningún error y que necesitará los atributos HTML de datos en caso de que tenga habilitado JavaScript no intrusivo.

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

2

La única necesidad de un cambio de la generación etiqueta predeterminada estaba en mi caso, que se extiende por los resultados de comportamiento en anoying configuraciones de margen.

Me resolvieron mediante el uso de 'display: block'

Tal vez esto ayuda a algunas personas ..

7

he usado de 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 usted puede utilizar el construido en el camino, pero reemplazar el lapso con un div.

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

+0

Me gusta este enfoque. Mucho más fácil que duplicar todo el código de ValidationMessageHelper para un cambio tan pequeño. –

+0

Esperemos que no valide una fecha entre dos intervalos de tiempo ... – user2864740

0

Tal vez usted puede 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 respondido, por lo que el div no aparece en la carga del formulario.

Cuestiones relacionadas