2011-01-26 10 views
6

que tienen una anotación requerida en mi modelo:MVC3 no trabajar

[Required(ErrorMessage = "Please choose an option")] 
public bool? AnyDebts { get; set; } 

que han permitido la validación del cliente en el web.config:

<appSettings> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
    </appSettings> 

he referenciado los scripts jQuery en mi diseño:

<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery-1.4.4.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery-ui-1.8.6.custom.min.js")" type="text/javascript"></script> 

¿Qué más debo hacer para que la validación del cliente funcione? La validación del lado del servidor sigue funcionando.

EDIT:

Ah, ja!

He encontrado que la validación del lado del cliente está funcionando.

Sin embargo, específicamente, he encontrado que las propiedades del modelo no se validan del lado del cliente son aquellas anotadas con atributos personalizados. Por ejemplo:

[BooleanRequiredToBeTrue(ErrorMessage = "You must agree to the statements listed")] 
public bool StatementAgree { get; set; } 

El código para el atributo:

public class BooleanRequiredToBeTrueAttribute: RequiredAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     return value != null && (bool)value; 
    } 
} 

¿no son validados lado del cliente más?

+0

¿por qué llama a jquery dos veces? – craigmoliver

Respuesta

6
<script src="@Url.Content("~/Scripts/jquery-1.4.4.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 

son las únicas secuencias de comandos necesarias para que la validación del cliente funcione.

Y como siempre he aquí una demostración completa de trabajo:

Modelo:

public class MyViewModel 
{ 
    [Required(ErrorMessage = "Please choose an option")] 
    public bool? AnyDebts { get; set; } 
} 

controlador:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new MyViewModel()); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     return View(model); 
    } 
} 

Vista:

@model AppName.Models.MyViewModel 
@{ 
    ViewBag.Title = "Home Page"; 
} 
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 
@using (Html.BeginForm()) 
{ 
    <div>Debts</div> 
    <span>Yes</span> @Html.RadioButtonFor(x => x.AnyDebts, true) 
    <span>No</span> @Html.RadioButtonFor(x => x.AnyDebts, false) 

    @Html.ValidationMessageFor(x => x.AnyDebts) 
    <input type="submit" value="OK" /> 
} 

Observación: No tengo incluido jquery-1.4.4.js en mi opinión, porque ya se hace referencia en el diseño.

+0

¿Alguna idea sobre este @Darin Dimitrov? http://stackoverflow.com/questions/5663563/asp-net-mvc-3-unobtrusive-validation-and-radio-buttons – ozz

1

Echa un vistazo a este código.

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] 
public class RequiredIfAttribute : RequiredAttribute 
{ 
    public string PropertyName { get; set; } 
    public Enums.BasicOperationType BasicOperationType { get; set; } 

    public RequiredIfAttribute(string propertyName, Enums.BasicOperationType BasicOperationType) 
    { 
     this.PropertyName = propertyName; 
     this.BasicOperationType = BasicOperationType; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     Type objectType = validationContext.ObjectType; 
     PropertyInfo[] neededProperties = objectType.GetProperties().Where(propertyInfo => propertyInfo.Name == PropertyName).ToArray(); 
     if (Core.Helpers.EnumHelper.TryParse<Enums.BasicOperationType>(Convert.ToInt16(neededProperties[0].GetValue(validationContext.ObjectInstance, null))) == BasicOperationType) 
      return base.IsValid(value, validationContext); 

     return base.IsValid(0, validationContext); 
    } 
} 
0

Para mi caso, sólo sucede cuando se utiliza IE en el modo de caprichos, mis opciones son Modo Navegación: IE9, Modo Documento: rarezas. Esto da como resultado que la validación del lado del cliente no funcione para mí. Sin embargo, la misma página funciona bien en Firefox, Chrome e IE9, modo navegador: IE9, modo documento: estándares IE9 cuando se usa la barra de herramientas del desarrollador. No es que sea una solución, sino una posible ventaja