2009-04-01 21 views
13

पर मॉडल की गुणों को बदलना मैं एएसपी.नेट एमवीसी के साथ खेल रहा हूं और कुछ ऐसी चीज में भाग गया जिसे मैं समझ नहीं सकता।एएसपी.नेट एमवीसी: पोस्टबैक

मान लीजिए मैं है इस तरह एक वस्तु:

public class TestObject 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

और एक दृश्य के पेज (Create.aspx) इस तरह:

:

<form action="/Create" method="post"> 
    <p> 
     <%=Html.TextBox("Name") %> 
    </p> 
    <p> 
     <%=Html.TextBox("Age")%> 
    </p> 
</form> 

और मेरे नियंत्रक पर मैं इन कार्यों है

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Create() 
{ 
    return View(new TestObject { Name = "DefaultName", Age = 10 }); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(TestObject o) 
{ 
    o.Name = "ChangedNameToSomethingElse"; 
    o.Age = 15; 
    return View(o); 
} 

Html.TextBox() विधि हमेशा डिफ़ॉल्ट मानों के साथ टेक्स्टबॉक्स को जेनरेट करता है, यहां तक ​​कि pos के बाद भी टैब, जहां वस्तु को इसके मूल्यों पर विभिन्न गुणों के साथ वापस पारित किया जाता है। अब, दिया गया है, मैं एक असली दुनिया के उदाहरण के बारे में नहीं सोच सकता हूं कि मैं ऐसा क्यों करना चाहता हूं लेकिन मुझे अभी भी समझ में नहीं आ रहा है कि मैं हमेशा मॉडल के मूल्यों के साथ क्यों बना रहता हूं जो टेक्स्ट बनाएं AcceptVerbs(HttpVerbs.Get) विशेषता के साथ।

नोट: मैंने Html.TextBox("Name", Model.Name) को आजमाया है लेकिन परिणाम अभी भी वही है। और मैंने सत्यापित किया कि AcceptVerbs(HttpVerbs.Post) के साथ क्रिया बनाएं वास्तव में दृश्य में व्यूडेटा के माध्यम से एक मान पास करके चलाती है। इसके अलावा, जब मैं <%=Model.Name %> के साथ मान आउटपुट करता हूं, लेकिन फिर भी, टेक्स्टबॉक्स पर नहीं, तो udated मान प्रदर्शित होता है।

क्या कुछ स्पष्ट है जो मुझे याद आ रही है, या क्या इस व्यवहार के पीछे कोई तर्क है?

+3

आप इसी तरह के प्रश्न के उत्तर में भी रुचि रखते हैं - http://stackoverflow.com/questions/953330/does-html-textbox-uses-request-params-instead-of-model/954524#954524 –

उत्तर

14

यदि आप विधि की घोषणा के माध्यम से या अपडेटमोडेल या TryUpdateModel द्वारा TestObject जैसी किसी ऑब्जेक्ट के माध्यम से पोस्ट अनुरोध के परिणाम को बाध्य करते हैं, तो मॉडलस्टेट नामक एक संपत्ति इन मानों से भर जाएगी। टेक्स्टबॉक्स जैसे एचटीएमएल हेल्पर्स हमेशा एक स्पष्ट रूप से पारित मॉडल ऑब्जेक्ट पर मॉडलस्टेट से जुड़ेंगे।

+0

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

+7

मैंने अभी चेक किया है। पोस्ट विशेषता के साथ अपनी कार्यवाही में ModelState.Clear() को कॉल करके आप जो चाहते हैं उसे प्राप्त कर सकते हैं। – dpen2000

+0

हाँ, ऐसा लगता है कि यह काम करता है। आपकी मदद के लिए धन्यवाद। यदि कोई व्यक्ति एक अलग विधि जानता है जो उपयोगी भी हो सकता है तो मैं थोड़ी देर के लिए खुला प्रश्न छोड़ दूंगा। –

3

प्रयास करें यह एक: - (आशा है कि यह आप के लिए काम करेंगे)

[HttpPost] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(TestObject o) { 
    ModelState.Clear();  
    o.Name = "ChangedNameToSomethingElse";  
    o.Age = 15; 
    return View(o); 
} 
9

मैं जानता हूँ कि यह एक लंबे समय पहले उत्तर दिया गया है, लेकिन इस अधिक लक्षित समाधान है कि मेरे लिए काम करता है।

[HttpPost] 
public ActionResult Create(TestObject o) { 
    ModelState.Remove("Name");  
    o.Name = "ChangedNameToSomethingElse";  
    ModelState.Remove("Age");  
    o.Age = 15; 
    return View(o); 
} 

आशा है कि इससे किसी को वहां मदद मिलेगी।

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