के बीच पैरामीटर और मान्यता राज्य बनी रहती है जब मैं डिफ़ॉल्ट मॉडल एक जटिल वस्तु जो एक कार्रवाई के लिए एक पैरामीटर है प्रपत्र मापदंडों बाध्य करने के लिए बाध्यकारी उपयोग करते हैं, ढांचा मूल्यों के लिए पारित किया याद है पहला अनुरोध, जिसका अर्थ है कि उस कार्रवाई के बाद के किसी भी अनुरोध को पहले के समान डेटा मिलता है। पैरामीटर मान और सत्यापन स्थिति असंबद्ध वेब अनुरोधों के बीच बनी हुई है।ASP.NET MVC बीटा 1: DefaultModelBinder को गलत तरीके से असंबंधित अनुरोध
यहाँ मेरी नियंत्रक कोड है (service
एप्लिकेशन के पिछले सिरे पर करने के लिए उपयोग का प्रतिनिधित्व करता है):
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Create()
{
return View(RunTime.Default);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(RunTime newRunTime)
{
if (ModelState.IsValid)
{
service.CreateNewRun(newRunTime);
TempData["Message"] = "New run created";
return RedirectToAction("index");
}
return View(newRunTime);
}
मेरे .aspx (दृढ़ता से ViewPage<RunTime
के रूप में आपके द्वारा लिखा गया>) दृश्य की तरह निर्देशों में शामिल हैं:
<%= Html.TextBox("newRunTime.Time", ViewData.Model.Time) %>
यह DefaultModelBinder
वर्ग है, जो meant to autobind my model's properties है उपयोग करता है।
मैं पेज मारा, मान्य डेटा दर्ज करें (उदा समय = 1)। ऐप सही समय = 1 के साथ नई वस्तु को बचाता है। फिर मैं इसे फिर से दबाता हूं, अलग-अलग मान्य डेटा दर्ज करता हूं (उदा। समय = 2)। हालांकि सहेजा गया डेटा मूल है (उदा। समय = 1)। यह सत्यापन को भी प्रभावित करता है, इसलिए यदि मेरा मूल डेटा अमान्य था, तो भविष्य में दर्ज किए गए सभी डेटा को अमान्य माना जाता है। आईआईएस को पुनरारंभ करना या मेरे कोड को पुनर्निर्माण करना लगातार स्थिति को फहराता है।
मैं अपने खुद के हार्ड-कोडेड मॉडल बांधने की मशीन, एक बुनियादी अनुभवहीन उदाहरण जिनमें से नीचे दिखाया गया है लिख कर इस समस्या को ठीक कर सकते हैं।
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([ModelBinder(typeof (RunTimeBinder))] RunTime newRunTime)
{
if (ModelState.IsValid)
{
service.CreateNewRun(newRunTime);
TempData["Message"] = "New run created";
return RedirectToAction("index");
}
return View(newRunTime);
}
internal class RunTimeBinder : DefaultModelBinder
{
public override ModelBinderResult BindModel(ModelBindingContext bindingContext)
{
// Without this line, failed validation state persists between requests
bindingContext.ModelState.Clear();
double time = 0;
try
{
time = Convert.ToDouble(bindingContext.HttpContext.Request[bindingContext.ModelName + ".Time"]);
}
catch (FormatException)
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName + ".Time", bindingContext.HttpContext.Request[bindingContext.ModelName + ".Time"] + "is not a valid number");
}
var model = new RunTime(time);
return new ModelBinderResult(model);
}
}
क्या मुझे कुछ याद आ रही है? मुझे नहीं लगता कि यह एक ब्राउज़र सत्र समस्या है क्योंकि यदि समस्या एक ब्राउज़र में दर्ज की गई है और दूसरे में दूसरा डेटा दर्ज किया गया है तो मैं समस्या को पुन: उत्पन्न कर सकता हूं।
यह सटीक बात मेरे साथ पहले हुई है। इसे समझने में मुझे काफी समय लगा। भविष्य में, एमवीसीकंट्रिब को अपने विंडसर कॉन्टैनेर एक्सटेंशन विधियों का उपयोग करके अपने नियंत्रकों को पंजीकृत करने दें। –
अच्छी नोक - धन्यवाद बेन। आपको वोट प्राप्त करने और हरे रंग की टिक प्राप्त करने के लिए टिप्पणी के बजाय इसे उत्तर के रूप में रखना चाहिए था! –
धन्यवाद एलेक्स, मैं दोपहर के अधिकांश दिनों के लिए इस सटीक समस्या के खिलाफ अपना सिर मार रहा हूं। –