2010-05-27 13 views
12

यह वास्तव में एक अजीब व्यवहार है, और मैंने यह पता लगाने के लिए कुछ डेमो कोड सेट अप किया है कि क्या हो रहा है।MVC2 TextBoxFor सबमिट सबमिट करने के बाद अपडेट नहीं हो रहा है?

असल में दो कार्य और एक दृश्य है। पहली कार्रवाई दृश्य में एक खाली मॉडल भेजती है, अनुभाग कार्रवाई मॉडल प्राप्त करती है, इसकी सामग्री बदलती है और इसे उसी दृश्य में वापस भेजती है।

विचलन, दृश्य में है, मॉडल में इसमें अद्यतन मान हैं, लेकिन जब मैं एक HTML करता हूं। टेक्स्टबॉक्स फोर (x => x.PropertyNameHere) यह उसमें अनलर्टेड मान वाला टेक्स्टबॉक्स प्रस्तुत करता है।

लॉल ... मैं शौचालय हास्य के लिए पहले से माफ़ी मांगता हूं, लेकिन यह दिन को बहुत उबाऊ होने से रोकता है। ;)

क्या किसी को पता है कि यहां क्या हो रहा है? टेक्स्टबॉक्स का आउटपुट मूल्य मान में पुराना मान डालने के लिए क्यों है?

/Views/Demo/Index.aspx

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<TestWeb.DemoModel>" %> 
<!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>Demo</title> 
</head> 
<body> 
    <div> 
     <%using (Html.BeginForm("DemoSubmit", "Admin", FormMethod.Post)) { %> 
     Foo: <%=Html.TextBoxFor(x => x.Foo)%> <%:Model.Foo %><br /> 
     Bar: <%=Html.TextBoxFor(x => x.Bar) %> <%:Model.Bar %><br /> 
     PoopSmith: <%=Html.TextBoxFor(x => x.PoopSmith) %> <%:Model.PoopSmith %><br /> 
     <button type="submit">Submit</button> 
     <%} %> 
    </div> 
</body> 
</html> 

DemoModel.cs

namespace TestWeb { 
    public class DemoModel { 
     public string Foo { get; set; } 
     public int Bar { get; set; } 
     public string PoopSmith { get; set; } 
    } 
} 

DemoController.cs

public class AdminController : Controller { 

     public ActionResult Index() { 
      var m = new DemoModel(); 
      return View(m); 
     } 

     public ActionResult DemoSubmit(DemoModel demo) { 
      demo.Foo += "!!!"; 
      demo.Bar++; 
      demo.PoopSmith += " has pooped."; 
      return View("Index", demo); 
     } 
} 

:

यहाँ दोहराने के लिए कोड है और वह पहले विचित्र उत्पादन है:

Bizarre http://i47.tinypic.com/308cwvb.png

उत्तर

14

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

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

मैं कुछ लोगों को (मैं ModelState को लिख कर लगता है) इस के आसपास हो रही देखा है, लेकिन मेरी पसंद हमेशा डिफ़ॉल्ट सहायकों का उपयोग नहीं करने के लिए यदि वे न मेरी मदद। छिपे हुए क्षेत्रों के लिए विशेष रूप से सच है: अधिकांश लोग भ्रमित हो जाते हैं जब वे एक छिपे हुए क्षेत्र में मूल्य निर्धारित करते हैं लेकिन वास्तविक मूल्य का उपयोग पोस्ट से होता है। कम से कम वहाँ एक सवाल अतः :-)

"अधिकांश लोगों को" भूल जाओ और "हर कोई" से बदलने पर इसके बारे में हर दूसरे दिन है।

ASP.NET MVC: Hidden field value does not get rendered using HtmlHelper.Hidden

http://blog.johnwest.com/post/ASPNET-MVC-Hidden-Form-Field-Bug.aspx

http://blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc-s-html-helpers-render-the-wrong-value.aspx?utm_medium=Twitter&utm_source=Shared

अद्यतन ओह मैं (आप अकेले नहीं हैं) आज से एक और एक मिल गया:

How to update textbox value

+0

+1 एलओएल! आपके खोज कौशल मेरे से बेहतर हैं! यह समझ में आता है, उत्तर के लिए धन्यवाद। –

6

Do ModelState।स्पष्ट(); यह होने से रोकने के लिए अपने नियंत्रक में। इसके लिए MSDN देखें।

3

मैं ModelState.Clear() या ModelState.Remove() से बचूंगा जब तक कि आपको बिल्कुल नहीं करना पड़े। आम तौर पर यदि आप इस व्यवहार को देखते हैं तो ऐसा इसलिए होता है क्योंकि ए) आप पोस्ट-रीडायरेक्ट-गेट पैटर्न का पालन नहीं कर रहे हैं और होना चाहिए, या बी) यदि यह उचित नहीं है तो आपको एचटीएमएलहेल्पर की टेक्स्टबॉक्स विधि का उपयोग न करने पर विचार करना चाहिए, क्योंकि यह मुख्य रूप से है एक पीआरजी पैटर्न का पालन करते समय सत्यापन आदि के साथ मदद करने के लिए डिज़ाइन किया गया।

मुझे यकीन है कि अपवाद हैं (उदाहरण के लिए एक जादूगर-शैली यूआई इस तरह थोड़ा समाप्त कर सकता है), लेकिन मैं इसे डिफ़ॉल्ट दृष्टिकोण के रूप में ले जाऊंगा।

0

मुझे वीएस 2010 के साथ एक ही समस्या मिली और मैंने पाया कि मैंने पूरे दिन दीवार को मारा। मैंने पूरी रात के बारे में सोचा, मुझे लगता है कि मुझे कारण मिला। कारण दृढ़ता है। यह केवल ब्राउज़र पर जो भी मूल्य दर्ज किया जाता है उसे याद करता है। हालांकि, मुझे लगता है कि यह बाध्यकारी सिद्धांत का उल्लंघन करता है। यदि मुझे दृश्य में मॉडल पैरामीटर पास करने की अनुमति है, तो दृश्य को मॉडल के वर्तमान स्थिति में जो कुछ भी पारित किया जाए, उस पैरामीटर को बाध्य करना चाहिए।

1

समाधान मॉडलस्टेट का उपयोग करना है। ("[मोड का संपत्ति नाम]") इसे नियंत्रक के साथ नया मान सौंपने से पहले। या दृश्य पृष्ठ पर, विशेष मॉडल प्रॉपर्टी के लिए Html.TextBoxFor() को Html.TextBox() में बदलें।

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