2010-05-17 13 views
6

के साथ एएसपी.नेट एमवीसी 2 मॉडल सत्यापन विफल रहता है मेरे पास एक छोटा एमवीसी 2 ऐप है जो दो संस्कृतियों में प्रदर्शित होता है: एन-यूएस और ईएस-एमएक्स। एक भाग में उस तारीख के लिए उपयोगकर्ता इनपुट होता है जो मॉडल में वर्तमान दिनांक के साथ पूर्व-पॉप्युलेट होता है।गैर-यूएस दिनांक प्रारूप

एन-यूएस का उपयोग करते समय, दिनांक फ़ील्ड एमएम/डीडी/वाईय के रूप में प्रदर्शित होता है और बिना किसी सत्यापन त्रुटियों के एक ही प्रारूप का उपयोग करके बदला जा सकता है।

es-एमएक्स उपयोग करते समय, दिनांक फ़ील्ड dd/एम एम/yyyy के रूप में प्रदर्शित किया जाता है, लेकिन जब तिथि इस प्रारूप में संपादित किया जाता है, सर्वर साइड सत्यापन संदेश के साथ विफल रहता है:

मूल्य '17/05/1 99 1 'तिथि के लिए मान्य नहीं है।

उस संदेश के बारे में मुझे बाहर निकलने वाली पहली चीजों में से एक यह है कि यह स्थानीयकृत नहीं है। दोनों संदेश स्वयं (जो मुझे नहीं लगता कि मैं नियंत्रित कर सकता हूं) और फ़ील्ड का प्रदर्शन नाम (जिसे मैं नियंत्रित कर सकता हूं और मेरे कोड में स्थानीयकृत हूं)। एक स्थानीय प्रारूप में प्रदर्शित होना चाहिए।

मैंने यह देखने के लिए कोड के माध्यम से कदम उठाने का प्रयास किया है कि सत्यापन कहां विफल हो रहा है, लेकिन ऐसा लगता है कि कुछ संकलित एमवीसी या डेटा एन्नोटेशन कोड के अंदर ऐसा हो रहा है जो मैं नहीं देख सकता।

आवेदन विवरण: IIS6, ASP.NET 3.5 (सी #), MVC 2 आरटीएम

नमूना मॉडल कोड:

public class TestVieModel{ 
    [LocalizedDisplayNameDisplayName("TheDateDisplayName", NameResourceType=typeof(Resources.Model.TestViewModel))] 
    [Required(ErrorMessageResourceName="TheDateValidationMessageRequired", ErrorMessageResourceType=typeof(Resources.Model.TestViewModel))] 
    [DataType(DataType.Date)] 
    public DateTime TheDate { get; set; } 
} 

नमूना नियंत्रक कार्रवाई कोड:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Save(TestViewModel model) { 
    if(ModelState.IsValid) { // <--- Always is false when using es-MX and a date foramtted as dd/MM/yyyy. 
     // Do other stuff 
     return this.View("Complete", model); 
    } 

    // Validation failed, redisplay the form. 
    return this.View("Enter", model); 
} 

नमूना कोड देखें :

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<HispanicSweeps.Web.Model.LosMets.EnterViewModel>" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
    <head runat="server"> 
     <title>Test</title> 
    </head> 
    <body> 
     <% using (Html.BeginForm()) {%> 
      <%= Html.ValidationSummary(true) %> 

      <fieldset> 
       <legend>Fields</legend> 
       <div class="editor-label"> 
        <%= Html.LabelFor(model => model.TheDate) %> 
       </div> 
       <div class="editor-field"> 
        <%= Html.EditorFor(model => model.TheDate) %> 
        <%= Html.ValidationMessageFor(model => model.TheDate) %> 
       </div> 

       <p><input type="submit" value="Save" /></p> 
      </fieldset> 

     <% } %> 
    </body> 
</html> 

उत्तर

1

प्रमाणीकरण DataAnnotations कक्षा के भीतर होता है। आप अपने उद्देश्यों के लिए DataAnnotations कक्षाओं को उप-वर्गीकृत कर सकते हैं।

मैं एक नया MultiCultureDateType डेटा एन्नोटेशन क्लास तैयार करूंगा जो कई संस्कृतियों में तिथियों को मान्य करेगा।

अधिक जानकारी: http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

2

यहाँ कैसे मैं अपने मामले में समस्या हल हो जाती है। मैंने मैन्युअल रूप से नियंत्रक की तारीख को सत्यापित किया और उस संपत्ति के लिए मॉडलस्टेट को रीसेट कर दिया:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Save(TestViewModel model) { 

    var tempDate = new DateTime(); 
    var culture = CultureInfo.CurrentUICulture; 

    if(DateTime.TryParse(Request.Form["TheDate"], culture, DateTimeStyles.None, out tempDate)) { 
     model.DateOfBirth = tempDate; 
     ModelState.Remove("TheDate"); 
     } 

    if(ModelState.IsValid) { // <--- Now valid 
     // Do other stuff 
     return this.View("Complete", model); 
     } 

    // Validation failed, redisplay the form. 
    return this.View("Enter", model); 
    } 
संबंधित मुद्दे