2011-01-26 5 views
6

मैं अपने मॉडल पर एक आवश्यक एनोटेशन है मान्यता:MVC3 ग्राहक काम नहीं कर रहा

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

मैं web.config में ग्राहक सत्यापन सक्षम किया है:

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

मैं में jQuery लिपियों संदर्भित किया है मेरी लेआउट:

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

क्लाइंट सत्यापन कार्य करने के लिए मुझे और क्या करने की आवश्यकता है? सर्वर साइड सत्यापन अभी भी काम कर रहा है।

संपादित करें:

आह हे!

मुझे पता चला है कि क्लाइंट साइड सत्यापन काम कर रहा है।

हालांकि, विशेष रूप से, मैंने पाया है कि मॉडल गुणों को सत्यापित नहीं किया जा रहा है क्लाइंट पक्ष कस्टम विशेषताओं के साथ एनोटेटेड हैं। उदाहरण के लिए:

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

विशेषता के लिए कोड:

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

इन अब और ग्राहक के पक्ष पुष्टि नहीं कर रहे हैं?

+0

आप jquery दो बार क्यों बुला रहे हैं? – craigmoliver

उत्तर

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> 

क्लाइंट सत्यापन के लिए काम करने के लिए एकमात्र आवश्यक स्क्रिप्ट हैं।

और हमेशा की तरह यहाँ एक पूर्ण काम कर डेमो है:

मॉडल:

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

नियंत्रक:

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

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

दृश्य:

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

टिप्पणी: मैं नहीं हैशामिलमेरे विचार में क्योंकि यह पहले से ही लेआउट में संदर्भित है।

+0

इस पर कोई विचार @Darin Dimitrov? http://stackoverflow.com/questions/5663563/asp-net-mvc-3-unobtrusive-validation-and-radio-buttons – ozz

1

इस कोड पर एक नज़र डालें। IE9, दस्तावेज़ मोड:: क्वर्क्स

[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

मेरे मामले के लिए, यह केवल तब होता है जब quirks मोड में आईई का उपयोग, अपनी सेटिंग्स ब्राउज़र मोड कर रहे हैं। इसके परिणामस्वरूप क्लाइंट साइड सत्यापन मेरे लिए काम नहीं कर रहा है। हालांकि, डेवलपर टूलबार का उपयोग करते समय, वही पृष्ठ फ़ायरफ़ॉक्स, क्रोम और आईई 9, ब्राउज़र मोड: IE9, दस्तावेज़ मोड: IE9 मानकों में अच्छी तरह से काम करता है। यह एक समाधान नहीं है, लेकिन एक संभावित लीड