2011-01-26 20 views
6

Ho un'annotazione richiesto sul mio modello:MVC3 convalida del client non funziona

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

mi hanno permesso di convalida del client nel web.config:

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

ho fatto riferimento gli script jQuery nel mio layout:

<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> 

Cos'altro devo fare per rendere valida la validazione del client? La convalida del lato server è ancora funzionante.

MODIFICA:

Ah ah!

Ho trovato che la validazione lato client sta funzionando.

Tuttavia, in particolare, ho trovato che le proprietà del modello non vengono convalidate lato client sono quelle annotate con attributi personalizzati. Per esempio:

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

Il codice per l'attributo:

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

sono questi non convalidato più lato client?

+0

perché stai chiamando jquery due volte? – craigmoliver

risposta

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> 

sono gli unici script necessari per la convalida del client.

E come sempre ecco una demo completa di lavoro:

Modello:

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

Controller:

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" /> 
} 

Nota: non ho incluso jquery-1.4.4.js a mio avviso perché è già referenziato nel layout.

+0

Qualche idea su questo @Darin Dimitrov? http://stackoverflow.com/questions/5663563/asp-net-mvc-3-unobtrusive-validation-and-radio-buttons – ozz

1

Dai un'occhiata a questo codice.

[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

per il mio caso, succede solo quando si utilizza IE in quirks mode, le mie impostazioni sono Modalità Browser: IE9, modalità documento: quirks. Ciò si traduce in convalida lato client non funziona per me. Tuttavia, la stessa pagina funziona bene con Firefox, Chrome e IE9, Modalità browser: IE9, Modalità documento: standard IE9 quando si utilizza la barra degli strumenti di sviluppo. Non è una soluzione, ma un possibile lead

Problemi correlati