2010-04-05 9 views
6

यह काम कर रहा है, लेकिन कैसे ???एएसपीनेट एमवीसी पोस्टबैक पर मेरे गलत मूल्यों को कैसे याद करता है?

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Person person) 
{ 
    bool isvalid = ModelState.IsValid; 
    etc. 

व्यक्ति वस्तु एक संपत्ति जन्मतिथि, प्रकार दिनांक समय है:

मैं एक पद के लिए एक नियंत्रक कार्रवाई की है। जब मैं फॉर्म में कुछ अमान्य डेटा डालता हूं, तो 'ब्लब्ला' कहें जो स्पष्ट डेटाटाइम नहीं है, यह सही डेटा के साथ सभी (अन्य) व्यक्ति गुणों को भरता है और जन्मदिन की संपत्ति को एक नए खाली दिनांक समय के साथ भरता है। बूल isvalid मूल्य 'झूठा' है। अब तक इतना अच्छा है।

तो मैं यह नहीं:

return View(p); 

और ध्यान में रखते हुए मैं इस है:

<%= Html.TextBox("BirthDate", String.Format("{0:g}", Model.BirthDate)) %> 
<%= Html.ValidationMessage("BirthDate", "*") %> 

चींटी वहाँ यह आता है: मैं मॉडल उम्मीद नया, रिक्त दिनांक समय को रोकने के लिए क्योंकि मैं नहीं था कोई नया डेटा नहीं डालता है। दूसरा, जब व्यू कुछ प्रदर्शित करता है, तो यह डेटटाइम होना चाहिए, क्योंकि Model.BirthDate डेटटाइम के अलावा कुछ भी नहीं रख सकता है। लेकिन मेरे आश्चर्य के लिए, यह 'blabla' मान के साथ एक टेक्स्टबॉक्स दिखाता है! (और इसके पीछे लाल *)

कौन सा अच्छा है क्योंकि उपयोगकर्ता देख सकता है कि उसने क्या गलत लिखा है, लेकिन डेटटाइम फ़ील्ड में उस (blabla) स्ट्रिंग को दृश्य में कैसे स्थानांतरित किया जा सकता है?

संपादित करें: मॉडलस्टेट जानकारी ने मुझे यहां बहुत मदद की। मैं यह भी नोट करता हूं कि एमवीसी 2 में, जब आप एचटीएमएल के लिए अपना टेम्पलेट बनाते हैं। एडिटरफ़ोर() आपको इस व्यवहार को स्वयं लागू करना होगा। मैं एक

DateTime.ascx 
/विचारों/साझा/EditorTemplates फ़ोल्डर में

बनाया है, और वहाँ में मैं जाँच करने के लिए किया था अगर वहाँ इस संपत्ति मूल्य के लिए एक modelstate त्रुटि थी, और यदि हां, की जगह में अमान्य डेटा दिखाने मॉडल डेटा।

तो ध्यान में रखते हुए मैं इस का उपयोग करें:

<% 
bool invalidData = false; 
string propertyName = ViewData.ModelMetadata.PropertyName; 

ModelState ms = ViewData.ModelState[propertyName]; 
if (ms != null) 
{ 
    invalidData = ms.Errors.Count > 0; 
} 
string valueToshow = invalidData ? ViewData.ModelState[propertyName].Value.AttemptedValue : String.Format("{0:g}", Model); 
%> 
<input class="text-box single-line" id="<%= propertyName %>" name="<%= propertyName %>" type="text" value="<%= valueToshow %>" /> 

उत्तर

10

ModelState कुंजी फ़ील्ड नाम होने के साथ हर रूप तत्व के लिए KeyValuePairs रखती है:

<%= Html.LabelFor(model => model.DateOfBirth) %> 

और DateTime.ascx में मैं इस का उपयोग और मूल्य वह है जिसे आपने मैदान में रखा था। फिर एचटीएमएल हेल्पर्स मॉडलस्टेट में देखते हैं और यदि आप स्पष्ट रूप से कोई मान निर्दिष्ट नहीं करते हैं, तो वे मॉडलस्टेट से मान खींचेंगे।

+0

धन्यवाद, अब सहायक ने मॉडल में मूल्य को पार्स करने के बाद और अधिक नहीं किया। – Michel

4

पहले दर्ज मूल्य मॉडलस्टेट में संग्रहीत किया जाता है। जब आपको फॉर्म पर कोई त्रुटि हो, तो सहायक मॉडल या किसी विशेष रूप से आपूर्ति किए गए मानों के उपयोग के बजाय मॉडलस्टेट से मूल्य खींचता है (हुड के तहत, यदि आप एक स्पष्ट मूल्य प्रदान नहीं करते हैं तो यह मॉडल के लिए डिफ़ॉल्ट होगा कोई त्रुटि नहीं होने पर एक मूल्य है)।

+0

+1 जवाब के लिए, कीथ थोड़ा तेज था, आशा है कि आप अंकन उसके जवाब – Michel

+0

के रूप में मुझे लगता है कि यह जवाब सही है कोई आपत्ति नहीं है, और कीथ के बिल्कुल सही नहीं है। कीथ का जवाब बताता है कि यदि आप स्पष्ट रूप से कोई मान निर्दिष्ट नहीं करते हैं तो मॉडलस्टेट का उपयोग किया जाता है; यह उत्तर बताता है कि यदि कोई त्रुटि है, तो मॉडलस्टेट का उपयोग किया जाता है, चाहे कोई मान स्पष्ट रूप से निर्दिष्ट किया गया हो या नहीं। जब मॉडल त्रुटि होती है तो पोस्ट नियंत्रक के बाद जीईटी नियंत्रक को कॉल करने के लिए पैटर्न केवल तभी काम करता है क्योंकि मॉडलस्टेट व्यू डेटा हमेशा जीईटी नियंत्रक में आपके द्वारा कोड को ओवरराइड करता है। इसके अलावा –

1

मेरे पास 'पोस्टबैक' में कुछ कोड था जो अमान्य प्रोमो-कोड को हटा देगा और प्रतिक्रिया को पूंजीकृत करेगा। यहां तक ​​कि यदि आप नए मान के साथ मॉडल को अपडेट करते हैं तो यह प्रदर्शित नहीं किया जाएगा क्योंकि मॉडलस्टेट मान को प्राथमिकता दी जाती है (जैसा कि अन्य ने पहले से ही उत्तर दिया है)।

<%= Html.TextBox("PromoCode", Model.PromoCodes) %> 

लेकिन अगर आप एक मामले में जहां यह हो रहा था है और आप नहीं करना चाहते हैं पुराने मूल्य कायम यदि आप ऐसा करने की जरूरत है: (

ModelState.Remove("PromoCode"); 

या स्पष्ट रूप से modelstate में नए मान सेट शायद बेहतर दृष्टिकोण):

ModelState.SetModelValue("PromoCode", 
     new ValueProviderResult(newValue, newValue, CultureInfo.CurrentCulture)); 
+0

+1। – Michel

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