2010-05-08 9 views
6

मेरे पास ऐसा मॉडल है:एएसपीएनईटी एमवीसी - मॉडलस्टेट क्यों है। यह वैध फ़ील्ड "एक्स फ़ील्ड आवश्यक है" जब उस फ़ील्ड का मान हो?

public PurchaseOrder 
{ 
    [Required] [StringLength(15)] 
    public virtual string OrderNumber {get;set;} 
    // etc.   
} 

जब मैं दृश्य से ऑर्डर सबमिट करता हूं ($ .post का उपयोग करके, इनपुट प्रकार = सबमिट नहीं करता) यह मेरे नियंत्रक वर्ग पर जाता है:

public class PurchaseOrderController 
{ 
    public JsonResult Save(PurchaseOrder order) 
    { 
     // TryUpdateModel(order); // commented out since modelstate.isvalid remains false anyway 
     if (ModelState.IsValid) 
     { 
      // its never valid 
     } 
    } 
} 

मॉडलस्टेट IValid हमेशा त्रुटि के साथ झूठी वापसी करता है: "ऑर्डर नंबर फ़ील्ड आवश्यक है।" लेकिन इस क्षेत्र में एक मूल्य है (?? क्यों)

यह कहता है कि "मूल्य आवश्यक है" जब उसके पास कोई मूल्य हो? क्या मुझे कुछ याद आया है? क्या सबमिट के बजाए $ .post की वजह से है? मैं क्या कर सकता हूँ?

डीबगर इस तरह दिखता है:

alt text http://www.freeimagehosting.net/uploads/f734f3d95d.png

संपादित करें: अतिरिक्त जानकारी ....

मुझे सच में लगता है कि किसी कारण से मॉडल बाध्यकारी नहीं हो रहा है। जब मैं यहां प्राप्त इस कोड को आजमाता हूं:)

if (!ModelState.IsValid) 
{ 
    ModelState.Clear(); 
    ModelMetadata modelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => order, order.GetType()); 
    ModelValidator compositeValidator = ModelValidator.GetModelValidator(modelMetadata, base.ControllerContext); 

    foreach (ModelValidationResult result in compositeValidator.Validate(null)) 
    { 
     this.ModelState.AddModelError(result.MemberName, result.Message); 
    } 
} 

फिर ModelState.IsValid = true। compositeValidator.Validate() 0 त्रुटियां देता है। मुझे लगता है कि यह इंगित करता है कि मॉडल बाध्य नहीं था, लेकिन मुझे अभी भी पता नहीं क्यों।

नियंत्रक विधि वास्तव में इस तरह दिखती है (मूल रूप से इस प्रश्न को लिखते समय फ़िल्टर को छोड़ दिया गया)

[JsonFilter(Param = "order", JsonDataType = typeof(PurchaseOrder))] 
public JsonResult Save(PurchaseOrder order) { // etc ... } 

और जेसनफ़िल्टर जेसन सबमिट किए गए डेटा से पीओसीओ निकालने के लिए करता है:

filterContext.ActionParameters[Param] 
    = jsSerializer.Deserialize(inputContent, JsonDataType); 

मैंने इस लाइन पर ब्रेकपॉइंट लगाया है, और ऑर्डर मान्य है, प्लस ऑर्डर। ऑर्डर नम्बर का सही मान है।

तो अभी भी अनसुलझा है, लेकिन उम्मीद है कि यह अतिरिक्त जानकारी समाधान खोजने में मदद करेगी

+2

संपत्ति वर्चुअल क्यों चिह्नित है? क्या आप पीओसीओ परिवर्तन ट्रैकिंग का उपयोग कर रहे हैं? –

+0

मूल्य क्या है? आप '$ .post' का उपयोग कैसे कर रहे हैं? क्या यह सामान्य जमा के साथ काम करता है? –

+0

मुझे नहीं पता कि यह वर्चुअल क्यों है, ऐसा तब हुआ जब मैंने मौजूदा ऐप पर काम करना शुरू किया। –

उत्तर

1

ठीक है मैंने इसे "हल किया" है, लेकिन मुझे वास्तव में समझ में नहीं आया कि मैंने किए गए परिवर्तनों में क्यों मदद की है।

मैं तीन बातें करना था:

  1. json फिल्टर (फिल्टर बाध्य नहीं है)

  2. बदलें आवेदन करने के लिए contentType/json

    $ .ajaxSetup निकालें ({ सामग्री टाइप: "एप्लिकेशन/जेसन; charset = utf-8" });

  3. एमवीसी वायदा का उपयोग Microsoft.Mvc.dll को यहां वर्णित अनुसार डाउनलोड करें: http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx। Global.asax.cs में Application_Start() में इसे जोड़ने के लिए कहां कहता है:

    ValueProviderFactories.Factories.Add (नया JsonValueProviderFactory());

अब मुझे नहीं पता कि यह क्यों काम करता है, लेकिन यह है।

दुर्भाग्यवश इसका नकारात्मक पक्ष प्रभाव पड़ा है: सामग्री प्रकार सभी $ .get() और $ .post() विधियों पर लागू होता है, और मेरे सभी jqgrids तोड़ दिए जाते हैं - वे केवल तब काम करते हैं जब सामग्री प्रकार डिफ़ॉल्ट है आवेदन की/x-www फार्म-urlencoded

तो मैं सवाल पर 2 अनुवर्ती अनुरोध किया है:

  1. यह एक $ .post में सामग्री प्रकार सेट करने के लिए संभव है() कहते हैं? तो मुझे इसे वैश्विक स्तर पर सेट करने की आवश्यकता नहीं होगी Jquery - How to make $.post() use contentType=application/json?

  2. यदि सामग्री प्रकार एप्लिकेशन/जेसन है तो क्या jqrid काम करना संभव है? Jquery - How to make $.post() use contentType=application/json?

+0

ऐसा लगता है कि मुझे अपना $ .post() एस बदलने की जरूरत है जो नियंत्रक विधि को $ .ajax() पर कॉल करें। लेकिन ऐसा लगता है कि मैं कुछ गलत कर रहा हूं और इसे केवल तभी काम करना चाहिए यदि सामग्री टाइप/x-www-form-urlencoded का डिफ़ॉल्ट है। –

+0

जेके, आपके दो प्रश्न लिंक एक ही प्रश्न पर इंगित करते हैं। –

1

आप यह सुनिश्चित करें कि त्रुटि ORDERNUMBER क्षेत्र से आ रहा है कर रहे हैं ढूँढने में मदद करेगा?

यह अजीब लगता है कि त्रुटि संदेश में ऑर्डर नंबर 2 शब्दों में है।

क्षेत्र का नाम बदलने या आवश्यक टैग को निकालने का यकीन है कि यह वह जगह है जहाँ त्रुटि से आ रहा है की कोशिश करें।

+1

मुझे विश्वास है कि एमवीसी फ्रेमवर्क आपके लिए ऑटो-जादुई रूप से संभालता है। यह वही है जब आप Html.LabelFor (model.OrderNumber) जाते हैं। लेबल शब्दों के बीच एक जगह के साथ "ऑर्डर नंबर" कहता है। –

+0

यदि मैं [आवश्यक] एनोटेशन को हटा देता हूं, तो ModelState.IsValid == सत्य। यह एनोटेशन के साथ एकमात्र क्षेत्र भी है। –

1

एक मौका है कि आपकी jQuery पोस्ट कंट्रोलर पर वापस सही तरीके से पोस्ट नहीं कर रही है। आप उस ऑब्जेक्ट की बजाय केवल ऑर्डर नंबर पोस्ट कर सकते हैं जो मॉडल का सटीक रूप से प्रतिनिधित्व करता है। मुझे आपकी जावास्क्रिप्ट बिल्कुल निश्चित होने के लिए देखना होगा।

कि विधि के लिए पोस्ट करने के लिए सही तरीका होगा (अपने आदेश संख्या संभालने जा "ORDERNUMBER" नामक एक जावास्क्रिप्ट चर में संग्रहीत किया जाता है:

$.post([url to method], 
     { order: { OrderNumber: orderNumber } }, 
     function(json) { 
     //Insert code for actions to take after AJAX post returns. 
     }, 
     'json'); 

यदि यह मामला है, तो अगला कदम मैं था यह जांचना दोहराएं कि जावास्क्रिप्ट वास्तव में आपके ऑर्डर नंबर के मूल्य को कैप्चर कर रहा है और इसे अनुरोध के हिस्से के रूप में पोस्ट कर रहा है।फायरबग के माध्यम से एक त्वरित परीक्षा आपको यह बताने में सक्षम होना चाहिए कि क्या हो रहा है या नहीं।

संबंधित मुद्दे