2012-10-19 9 views
5

मेरे पास एक एएसपी.नेट एमवीसी एप्लीकेशन है जो वस्तुओं की एक सूची प्रदर्शित करता है। से अधिक आइटम मेरे विचार पेज मैं पाश में और आंशिक दृश्य प्रत्येक आइटम, तो तरह प्रस्तुत करना:एचटीएमएल। गलत तत्व के लिए बाध्यकारी

@foreach(var item in Model.items) 
{ 
    <li> 
     @Html.Partial("ItemView", item) 
    </li> 
} 

आइटम को देखते हुए, मैं एक फार्म एक 'हटाएं' बटन है, इस तरह के साथ प्रत्येक आइटम लपेटो:

@using(Html.BeginForm(...)) 
{ 
    @Html.HiddenFor(m=>m.Id) 
    <label>@Model.Name (@Model.Id)</label> 
    <input type="submit" value="Delete"/> 
} 

आइटम ठीक से प्रदान की गई हैं, जिसके परिणामस्वरूप पेज उनके वास्तविक नामों और प्रदर्शित आईडी से सभी वस्तुओं का एक अच्छा सूची है।

संपादित करें: जाहिर है, जैसा कि मैंने पहले लिखा था, उसके विपरीत @ हिडन के साथ भी होता है।

इसके अलावा, यह केवल दूसरी बार फॉर्म प्रदान किया जाता है (यानी, हटाए गए बटनों में से एक के बाद क्लिक किया जाता है), पहली बार सब ठीक से काम कर रहा है। मेरी क्रिया विधियां इस तरह दिखती हैं:

public ActionResult AllItems() 
{ 
    var model = new AllItemsModel(); 
    return PartialView(model); 
} 

public ActionResult Delete(DeleteModel model) 
{ 
    .... Perform the delete ... 
    return PartialView("AllItems", new AllItemsModel()); 
} 

ऐसा क्यों हो रहा है?

उत्तर

8

मुझे लगता है कि ऐसा होता है क्योंकि आप पहले से ही अपने RouteData में एक Id पैरामीटर:

public ActionResult SomeAction(int id) 
{ 
    var model = ... 
    return View(model); 
} 

और आप /somecontroller/someaction/123 साथ पेज का अनुरोध किया है। छुपे हुए सहायक सहायक अब रूट मानों से आईडी का उपयोग करते हैं, न कि आइटम की आईडी। आईडी से अलग कुछ के लिए अपने आइटम दृश्य मॉडल पर संपत्ति का नाम बदलने का प्रयास करें। उदाहरण के लिए ItemId

एक और संभावना यह है कि समस्या केवल पोस्टबैक के बाद होती है और जब पृष्ठ प्रारंभ में प्रस्तुत नहीं किया जाता है। आपकी पोस्ट कार्रवाई दिखाकर इस संभावना को आगे बढ़ाने में मदद मिल सकती है।


अद्यतन:

, ठीक है अब आप पता चला है कि अपनी पोस्ट कार्रवाई बातें भी बहुत कुछ स्पष्ट कर रहे हैं:

public ActionResult Delete(DeleteModel model) 
{ 
    .... Perform the delete ... 
    return PartialView("AllItems", new AllItemsModel()); 
} 

आप मूल रूप से एक नया दृश्य मॉडल यहाँ बनाने और इसे से गुजर रहे हैं आंशिक दृश्य के लिए। लेकिन बाध्यकारी होने पर एचटीएमएल हेल्पर्स हमेशा मॉडलस्टेट से मूल्य का उपयोग करते हैं। और उसके बाद ही आपके दृश्य मॉडल से मूल्य। इसलिए यदि आप अपने POST कार्रवाई के अंदर अपने मॉडल पर गुणों को संशोधित करना चाहते हैं तो सुनिश्चित करें कि आपने इस मान को मॉडलस्टेट से पहले हटा दिया है। अपने उदाहरण में के बाद से आप पूरी तरह से पूरे दृश्य मॉडल खरोंच है आप पूरे ModelState स्पष्ट कर सकता है (एक new AllItemsModel() बनाकर):

public ActionResult Delete(DeleteModel model) 
{ 
    .... Perform the delete ... 

    // Clear the modelstate otherwise the view will use the values that were initially posted 
    // and not the values from your view model 
    ModelState.Clear(); 
    return PartialView("AllItems", new AllItemsModel()); 
} 

यह व्यवहार डिज़ाइन द्वारा है और सभी HTML सहायकों, न केवल HiddenFor सहायक लागू होता है।

+0

वाह, उत्कृष्ट अवलोकन। मैं जांच करूंगा, मुझे लगता है कि मेरे पास एक नहीं है। – zmbq

+0

आपका पहला सुझाव सही नहीं था, लेकिन आपका दूसरा वादा करता है। बहुत बुरा मैं दो बार +1 नहीं कर सकता ... मैं इसे देख लूंगा। – zmbq

+0

हाँ, यह बिल्कुल था। आपका बहुत बहुत धन्यवाद! – zmbq

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