2010-11-24 3 views
12

में फॉर्म क्रियाएं रद्द करें मैं सोच रहा हूं कि एएसपीनेट एमवीसी 3 आरसी में फॉर्म जमा करते समय आप कई फॉर्म क्रियाओं को लागू करने के बारे में कैसे जा सकते हैं।सहेजें कैसे कार्यान्वित करें सहेजें और बंद करें एएसपी.नेट एमवीसी 3 आरसी

यदि मैं उपयोगकर्ता को संपादित कर रहा हूं, उदाहरण के लिए मैं निम्नलिखित बटनों के साथ एक एक्शन बार रखना चाहता हूं;

"सहेजें" | "सहेजें और बंद करें" | "रद्द करें"

सहेजें - फ़ॉर्म सबमिट करता है और सहेजता है, आपको संपादन स्क्रीन पर लौटता है। मानक इनपुट/सबमिट बटन के रूप में आसानी से कार्यान्वित किया जा सकता है। यहाँ कुछ खास नहीं है।

इस के लिए

नियंत्रक कोड की तरह

public ActionResult Edit(UserViewModel model) 
{ 
    ... 
    return RedirectToAction("Edit", model.Id"); 
} 

रद्द लग सकता है - बस पिछली स्क्रीन पर आप देता है। मैं इसके लिए एक एंकर टैग का उपयोग करने के बारे में सोच रहा था।

<a href="@Request.UrlReferrer" class="button">Cancel</a> 

लेकिन मैं कैसे को लागू करने पर स्टम्प्ड रहा हूँ "सहेजें और बंद करें" जब आप एक ही प्रपत्र डेटा सबमिट करना होगा। मैं शायद एक निरर्थक करीबी परम होने के बारे में सोच रहा था?

public ActionResult Edit(UserViewModel model, bool? close) 
{ 
    ... 
    return close.GetValueOrDefault(false) ? RedirectToAction("Index", model.Id" : RedirectToAction("Edit", model.Id"); 
} 

लेकिन मैं इस मामले में इस अतिरिक्त फार्म को कैसे प्रस्तुत करूं?

यदि संभव हो, तो मैं उपरोक्त मॉकअप में सबमिट को संभालने के लिए एक ही फॉर्म कार्रवाई करना चाहता हूं।

मुझे कोई दिलचस्पी है कि अगर कोई और इस विचार के आसपास एक अच्छा उपयोगकर्ता इंटरैक्शन मॉडल के साथ आया है।

समाधान

मैं नीचे उमर के सुझाव का उपयोग कर समाप्त हो गया लेकिन एक स्ट्रिंग में पारित करने के बजाय मैं एक enum में ले लिया तो मैं अपने सभी नियंत्रकों में स्ट्रिंग जांच कर की जरूरत नहीं है।

public ActionResult Edit(UserViewModel model, FormAction actionType) 
{ 
    // pre-check 
    if (actionType == FormAction.Cancel) 
    // just return user to previous view and don't save. 

    // Save code 

    if (actionType == FormAction.Save) 
    return ... 
    else if (actionType == FormAction.SaveAndClose) 
    .... 
} 

क्योंकि मैं एक दोस्ताना "सहेजें और बंद करें" <input> बटन पर पाठ चाहता था, लेकिन एक enum उपयोग करना चाहता था मुझे लगता है कि पार्स किया FormAction के लिए एक कस्टम ModelBinder कार्यान्वित किया।

मैंने <button> टैग का उपयोग नहीं किया क्योंकि थीमिंग <input> टैग के लिए पहले से ही मौजूद थी।

उत्तर

18

आप एक ही name विशेषता के साथ एक फॉर्म में एकाधिक सबमिट बटन प्राप्त कर सकते हैं लेकिन value विशेषताएँ अलग-अलग हैं। जो भी बटन क्लिक किया गया है, संबंधित value सर्वर पर पोस्ट किया जाएगा।

आप Cancel के लिए एक साधारण लिंक का उपयोग कर सकते हैं लेकिन मैं इसे किसी भी बटन के रूप में शामिल करूंगा।

<input type="submit" name="actionType" value="Save" /> 
<input type="submit" name="actionType" value="Save and Close" /> 
<input type="submit" name="actionType" value="Cancel" /> 

और आपकी कार्रवाई में, मानों के लिए परीक्षण करें।

public ActionResult Edit(string actionType) 
{ 
    if(actionType == "Save") 
    { 
     // Save action 
    } 
    else if (actionType == "Save and Close") 
    { 
     // Save and quit action 
    } 
    else 
    { 
     // Cancel action 
    } 
} 

आप value विशेषता में लंबा पाठ होने पसंद नहीं है, तो आप मानक HTML आपको एक अलग मूल्य और अलग-अलग पाठ परिभाषित करने देता है <button> टैग का उपयोग कर सकते हैं।

+0

http://stackoverflow.com/questions/2423041/using-two- सबमिट-बटन-अंदर-एकल-फॉर्म/2426152 # 2426152 – takepara

+0

धन्यवाद उमर। वही था जो मैं चाहता था। चीयर्स! –

+0

इस दृष्टिकोण के आधार पर अंतिम समाधान के साथ मेरा प्रश्न अपडेट किया गया। काफी समान, तारों के बजाय एक enum का उपयोग करने के लिए बस साफ किया। –

5

@Omar द्वारा सुझाव बहुत अच्छा है। यहां बताया गया है कि मैंने इस मामले में थोड़ा और सामान्य कैसे बनाया जहां मैं एक पुष्टिकरण चाहता था जब उपयोगकर्ता को किसी ऑब्जेक्ट को हटाने के लिए कहा जाए। नोट! HttpPost में मैं विधि को पारित आइटम का उपयोग करने के बजाय ऑब्जेक्ट को फिर से खींच रहा हूं। आप दृश्य में सभी डीबी कॉल को कम कर सकते हैं ताकि "आइटम" पॉप्युलेट हो।

यहां व्यू मॉडल है

public class DeleteViewModel<T> { 
    public string ActionType { get; set; } 
    public T Item { get; set; } 
} 

नियंत्रक

public ActionResult Delete(int id) { 
     DeleteViewModel<Category> model = new DeleteViewModel<Category>() { 
      Item = categoryRepository.Categories.FirstOrDefault(x => x.CategoryID == id) 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Delete(DeleteViewModel<Category> model) { 
     if (model.ActionType == "Cancel") 
      return RedirectToAction("Index"); 
     else if (model.ActionType == "Delete") { 
      var cat = categoryRepository.Categories.FirstOrDefault(x => x.CategoryID == model.Item.CategoryID); 
      categoryRepository.Delete(cat); 
      return RedirectToAction("Index"); 
     }   
     //Unknown Action 
     return RedirectToAction("Index"); 
    } 

देखें

<div class="actions"> 
     <div class="actions-left"><input type="submit" value="Cancel" name="ActionType"/></div> 
     <div class="actions-right"><input type="submit" value="Delete" name="ActionType" /></div> 
    </div> 
+0

मुझे यह समाधान बेहतर लगता है क्योंकि यह आपको उस मॉडल को पास करने की अनुमति देता है जिस पर काम किया जा रहा है। – Buzzer