2009-05-07 19 views
5

मुझे एक ऐसे फॉर्म में फसल हो रही है जिसे मैं पोस्ट करने का प्रयास कर रहा हूं। परिदृश्य में जहां फॉर्म मान्य नहीं है, मैं ModelState.AddModelError() पर कॉल करने का मानक मार्ग ले रहा हूं और फिर परिणाम देखें।एएसपी.नेट एमवीसी मॉडलस्टेट/एचटीएमएल। टेक्स्टबॉक्स पोस्टबैक समस्या

बात यह है कि एचटीएमएल। * हेल्पर्स को प्रतिपादन करते समय पोस्ट मूल्य चुनना होता है और मैं देख रहा हूं कि मेरे टेक्स्ट फ़ील्ड्स केवल ऐसा करते हैं यदि मैं उन्हें पोस्टबैक एक्शन की पैरामीटर सूची में शामिल करता हूं, जो देखने की आवश्यकता नहीं है क्योंकि कुछ रूपों में पैरामीटर के रूप में सभी को सूचीबद्ध करना चाहते हैं।

मेरे कार्रवाई कोड मोटे तौर पर है:

Minimum: <%= Html.TextBox("MinVolume", null, new { size = 5 })%> 
:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult EditDataDefinition(long? id, string name) 
{ 
    var dataDefinition = ... 

    // do some validation stuff 
    if (!ModelState.IsValid) 
    { 
     // manually set checkbox fields via ViewData seeing as this STILL doesn't work in MC 1.0 :P 
     // ... 
     return View(dataDefinition); 
    } 

} 

अब, dataDefinition (जो एसक्यूएल संस्था के लिए एक LINQ है) एक क्षेत्र MinVolume है, इस लाइन द्वारा ध्यान में रखते हुए नियंत्रित किया जाता है

फिर भी जब एक असफल मॉडलस्टेट सत्यापन के बाद दृश्य प्रस्तुत किया जाता है, तो हमारे द्वारा पोस्ट किए गए मूल पृष्ठ पर टाइप किए गए मान को सुरक्षित नहीं किया जाता है, मैं इसे पोस्टबैक विधि में पैरामीटर के रूप में शामिल करता हूं। सचमुच, मैं "समस्या का समाधान" कर सकते हैं ऐसा करने से:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult EditDataDefinition(long? id, string name, string minVolume) 

किसी कारण है कि क्षेत्र मूल्य संरक्षित किया जा करने के लिए मजबूर होगा। यह मेरे लिए बेवकूफ लगता है क्योंकि मेरे फॉर्म के मुकाबले ज्यादा मूल्य हैं और मुझे उस क्षेत्र के लिए पैरामीटर जोड़ने की ज़रूरत नहीं है।

कोई विचार?

उत्तर

4

यह हो सकता है कि आपके कोड:

<%= Html.TextBox("MinVolume", null, new { size = 5 })%> 

डिफ़ॉल्ट मान परम के लिए null ..has? हो सकता है कि यदि आप null से Model.MinVolume बदलते हैं तो यह मान जारी रहेगा। इस तरह:

<%= Html.TextBox("MinVolume", Model.MinVolume, new { size = 5 })%> 

मुझे यकीन है कि अपनी कार्रवाई मॉडल यद्यपि में मूल्य MinVolume वापस लौट आता है नहीं कर रहा हूँ।यदि ऐसा होता है, तो उपर्युक्त काम करना चाहिए। अन्यथा, आपको थोड़ा कार्रवाई को फिर से करने की आवश्यकता हो सकती है।

+0

नहीं, निर्दिष्ट नल निर्दिष्ट करना है कि मौजूदा मॉडल संदर्भ को मूल्य पूछने के लिए उपयोग किया जाना चाहिए। मिनवॉल्यूम निर्दिष्ट करना स्पष्ट है और उस मूल्य को पहले सबमिट किए गए स्थान के बजाय उपयोग करने के लिए मजबूर करेगा। –

+0

गलत। मिनीवॉल्यूम निर्दिष्ट करना बाद के पोस्ट के लिए ViewDataDoctionary और फिर ModelStateDictionary को देखता है। तो यदि मॉडल .MinVolume 5 becore संपादन कहता है, तो निर्दिष्ट करें MinVolume टेक्स्टबॉक्स में 5 रखेगा। फिर यदि कोई पोस्ट किया गया है (मान 3 कहें) लेकिन अमान्य पाया गया तो टेक्स्टबॉक्स 3 बार बार दिखाएगा। या तुमने कोशिश की? आप आम तौर पर 'नया' या 'बनाएं' दृश्य पर शून्य निर्दिष्ट करते हैं ताकि प्रारंभिक पोस्ट फ़ील्ड में खाली दिखाई दे, और बाद की पोस्ट दर्ज किए गए मान को जारी रखे। –

+0

यह वही तरीका है जो मैं इसे करता हूं और हर बार काम करता है। मैंने कभी भी कहीं नहीं देखा है जिसे आपको शून्य निर्दिष्ट करना है। एक लिंक जहां आपने देखा वह अच्छा होगा। – sirrocco

3

जब आप मॉडलस्टेट में मान को सेट करते हैं तो आप किस कुंजी का उपयोग कर रहे हैं? कोड जो टेक्स्टबॉक्स के लिए मान पैरामीटर सेट करता है, जैसा दिखता है:

downloaded framework code का प्रासंगिक हिस्सा।

string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string)); 
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : valueParameter), isExplicitValue); 

यदि प्रयास मूल्य मौजूद है आप देख सकते हैं, यह इसके उपयोग करेगा - लेकिन केवल तभी एक ही कुंजी उपलब्ध है।

मुझे पता है कि यह काम करता है क्योंकि मेरे पास कोई ऐसी क्रिया है जो कोई पैरामीटर नहीं लेती है और मूल्यों को सीधे ValueProvider से प्राप्त करती है और यह सत्यापन त्रुटियों को इंगित करने के लिए AddModelError का उपयोग करती है। मुझे यकीन है कि मेरे टेक्स्टबॉक्स में मान बनाए रखा गया है।

EDIT: मूल्यों को बनाए रखने के क्रम में, उन्हें किसी भी तरह से मॉडल से जुड़े रहने की आवश्यकता है। ऐसा करने का एक तरीका है उन्हें पैरामीटर सूची में जोड़ना। एक और तरीका UpdateModel का उपयोग करना है (श्वेतसूची में पैरामीटर नाम या श्वेतसूची के साथ)। एक तीसरा तरीका मॉडल को स्पष्ट रूप से @ जेने के उत्तर में पैरामीटर जोड़ना है। चूंकि सहायक केवल मॉडल राज्य से खींचता है, इसलिए मूल्यों को बनाए रखने के लिए वे वहां मौजूद होना चाहिए। यह अनुरोध की प्रपत्र संपत्ति को नहीं देखता है।

+0

कि क्षेत्र मान्य नहीं है बिलकुल नहीं - इस चरण में होने की आवश्यकता नहीं है। इसलिए यह फ़ॉर्म में सिर्फ एक "निर्दोष धारक" है और उम्मीद है कि यदि कोई अन्य फ़ील्ड स्वयं से व्यवहार नहीं करता है और इस प्रकार फॉर्म को दूसरी बार प्रस्तुत करने का कारण बनता है तो उसका नया मूल्य संरक्षित होता है। –

+0

मैं अचानक आश्चर्यचकित हूं कि अगर मैं गलती से यह धारणा कर रहा हूं कि मॉडलस्टेट मॉडल से मेल खाने वाले सभी फ़ील्ड को सुरक्षित रखने की कोशिश कर रहा है। शायद यह केवल उन फ़ील्ड को संरक्षित करता है जो पैरामीटर सूची के माध्यम से पारित होते हैं या AddModelError के माध्यम से संदर्भित होते हैं? यदि ऐसा है, तो यह निश्चित रूप से बेवकूफ दिखता है जैसा कि मैं निश्चित रूप से विशिष्ट मामलों के रूप में, फॉर्म में सब कुछ संरक्षित करना चाहता हूं। फिर फिर, एमवीसी अभी भी चेकबॉक्स फ़ील्ड को ठीक तरह से संरक्षित नहीं करता है ... –

0

के रूप में मैं समझता हूँ कि समाधान है:

[Transaction] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult EditDataDefinition(int id, FormCollection form) 
{ 
    T itemToUpdate = repository.Get(id); 
    UpdateModel(itemToUpdate, form.ToValueProvider()); 

    if (itemToUpdate.IsValid()) 
    { 
     repository.SaveOrUpdate(itemToUpdate); 
     return Json(ValidationResultToJson(itemToUpdate.ValidationResults())); 
    } 

    repository.DbContext.RollbackTransaction(); 
    return Json(ValidationResultToJson(itemToUpdate.ValidationResults())); 
} 

अच्छी किस्मत!

6

ओह मैन मैंने अभी अपना आवेदन डिज़ाइन सुधार लिया है। समस्या तब होती है क्योंकि आपके पास कस्टम सत्यापन (मेरे पास भी है)। आप के बाद

ModelState.AddModelError() 

इस

ModelState.SetModelValue("MinVolume", ValueProvider["MinVolume"]); 

ध्यान में रखते हुए यह

Mimum:<%=Html.Textbox("MinVolume")%> 

अभी तक सुनिश्चित नहीं क्यों यह काम करता है, लेकिन यह मेरे लिए काम किया हो गया है जोड़ने के लिए।

+0

ओह ... यह जवाब हो सकता है! जब मैं काम करने के लिए सुबह में जांच करेंगे। धन्यवाद। –

+2

यह काम करता है क्योंकि यह मॉडल को मान जोड़ता है, जिससे सहायक मूल्यों को खींचता है। UpdateModel का उपयोग करना भी काम करेगा, जो मैं उपयोग करता हूं और क्यों मेरे टेक्स्टबॉक्स मान संरक्षित किए जा रहे हैं। – tvanfosson

0

एक अन्य समाधान यदि आप दृश्य में टाइप है:

<%var minVolume=Request["MinVolume"]??"";%> 
<%=Html.Textbox("MinVolume",minVolume,new {size=5})%> 
0

कृपया यह लेख देखें ASP.NET में पोस्टबैक को संभालने के लिए अलग अलग तरीकों से देखने के लिए MVC

link text

+0

स्टार्टर के लिए अच्छा लेख। –

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