2012-11-30 13 views
7

संशोधित करने के बाद काम नहीं कर रहा है मेरे पास एक मुद्दा है जिसे मैं वास्तव में समझ में नहीं आता हूं। मेरे पास एक बहुत ही सरल मॉडल है जिसमें सार्वजनिक सदस्य के रूप में एक सूची है। जब भी मेरा नियंत्रक पोस्टबैक पर मॉडल से तत्व को हटा देता है तो TextBoxFor() HTML मददगार परिवर्तनों को लेने के लिए प्रतीत नहीं होते हैं। ये सहायक कुछ कैशिंग कैचिंग प्रतीत होते हैं लेकिन मैं अपनी अंगुली को उस पर नहीं डाल सकता।एमवीसी 4 एचटीएमएल टेक्स्टबॉक्स वर्कमोडेल

एक डेमो/रेप्रो यहां पाया जा सकता: http://broken.azurewebsites.net

रेप्रो

  1. नेविगेट शून्य आधारित मूल्यों
  2. "परीक्षण" बटन दबाएं साथ आबादी वाले http://broken.azurewebsites.net
  3. सूचना 4 स्तंभ मान को उस पृष्ठ को पोस्ट करने के लिए जहां मैं सूची में पहला आइटम हटाता हूं
  4. नोटिस "वास्तविक" मान सही हैं और 0 तत्व हेक्टर हटा दिया गया है, हालांकि यहां समस्या टेक्स्टबॉक्स फोर() के माध्यम से दिए गए मानों के साथ है। मैं यह नहीं समझ सकता कि यह तब भी 0 क्यों प्रस्तुत कर रहा है जब वह तत्व मौजूद नहीं है।

मॉडल

public class ItemViewModel 
{ 
    public string Description { get; set; } 
    public decimal? Amount { get; set; } 
} 

public class TestViewModel 
{ 
    public TestViewModel() 
    { 
     Items = new List<ItemViewModel>(); 
    } 

    public List<ItemViewModel> Items { get; set; } 
} 

नियंत्रक

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new TestViewModel(); 

     for (var i = 0; i < 4; i++) 
     { 
      model.Items.Add(new ItemViewModel { Description = i.ToString(), Amount = i }); 
     } 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(TestViewModel model) 
    { 
     model.Items.RemoveAt(0); 

     return View(model); 
    } 

} 

देखें

@model Demo.Models.TestViewModel 
@using (Html.BeginForm()) 
{ 
    <table> 
     <thead> 
      <tr><td>Description</td><td>Amount</td><td>Real-Description</td><td>Real-Amount</td></tr> 
     </thead> 
     <tbody> 
      @for (var i = 0; i < Model.Items.Count; i++) 
      { 
       var ii = i; 
       <tr> 
        <td>@Html.TextBoxFor(m => m.Items[ii].Description)</td> 
        <td>@Html.TextBoxFor(m => m.Items[ii].Amount)</td> 
        <td>@Model.Items[ii].Description</td> 
        <td>@Model.Items[ii].Amount</td> 
       </tr> 
      } 
     </tbody> 
    </table> 
    <button>Test</button> 
} 

उत्तर

15

बदलें अपनी पोस्ट सूचकांक के रूप में नीचे वांछित व्यवहार के लिए विधि:

TextBoxFor ModelState बजाय मॉडल मूल्य में पद मूल्य को बांधता है:

[HttpPost] 
    public ActionResult Index(TestViewModel model) 
    { 
     ModelState.Clear();  

     model.Items.RemoveAt(0); 

     return View(model); 
    } 

यहां इसका कारण बताया। तो आपके आवेदन में, जब आप टेस्ट बटन दबाते हैं, तो टेक्स्ट बॉक्स उनके पास पहले से मौजूद मान से बंधे होते हैं और मॉडल मान बदलने के बाद भी पोस्टबैक पर अपडेट नहीं होते हैं। पूर्व में, यदि पहली पंक्ति में टेक्स्ट बॉक्स 0 दिखा रहे हैं और वे पोस्ट बैक के बाद भी उस मान से बंधे रहेंगे और अंतर्निहित मॉडल के पास मूल्य 1 होगा। इस व्यवहार के पीछे कारण सत्यापन है। यदि आप टेक्स्ट बॉक्स में एक इंट की उम्मीद कर रहे हैं और उपयोगकर्ता इनपुट "SomeTextValue" है, तो मॉडल बाइंडर int संपत्ति से जुड़ने में सक्षम नहीं होगा और यह सत्यापन त्रुटि की स्थिति में होगा। फिर आप चाहते हैं कि उपयोगकर्ता "SomeTextValue" एक पूर्णांक नहीं है। कृपया एक पूर्णांक दर्ज करें क्योंकि आप उम्मीद करेंगे कि उपयोगकर्ता वहां मूल्य दर्ज करेगा।

रिक Strahl इस ब्लॉग में पूरी तरह से यह बताते हैं पोस्ट

http://www.west-wind.com/weblog/posts/2012/Apr/20/ASPNET-MVC-Postbacks-and-HtmlHelper-Controls-ignoring-Model-Changes

और नीचे ब्रांड विल्सन:

http://forums.asp.net/post/3688022.aspx

+0

धन्यवाद, मुझे यकीन है कि इस मुद्दे पर है हूँ। मैं परीक्षण और रिपोर्ट करूँगा। –

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