MVC जो सबमिट बटन दबाया गया है


128

मेरे MVC फॉर्म में दो बटन हैं:

<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />

मेरे नियंत्रक कार्रवाई से मुझे कैसे पता चलेगा कि कौन सा दबाया गया है?


सिर्फ इन बटन पर ऑनक्लिक घटनाओं को क्यों न जोड़ें जो कि अपने स्वयं के AJAX कॉल पर जाते हैं जो उनके उपयुक्त तरीकों पर जाएंगे? यानी <input name="submit" type="submit" id="submit" value="Save" onclick="saveMethod" />:?
छुरा

जवाबों:


169

अपने दोनों सबमिट बटन को एक ही नाम दें

<input name="submit" type="submit" id="submit" value="Save" />
<input name="submit" type="submit" id="process" value="Process" />

फिर अपने कंट्रोलर में सबमिट का मूल्य प्राप्त करें। केवल क्लिक किया गया बटन ही उसका मूल्य पार करेगा।

public ActionResult Index(string submit)
{
    Response.Write(submit);
    return View();
}

आप निश्चित रूप से एक स्विच ब्लॉक के साथ विभिन्न कार्यों को करने के लिए उस मूल्य का आकलन कर सकते हैं।

public ActionResult Index(string submit)
{
    switch (submit)
    {
        case "Save":
            // Do something
            break;
        case "Process":
            // Do something
            break;
        default:
            throw new Exception();
            break;
    }

    return View();
}

13
उन मुद्दों से सावधान रहें जो स्थानीयकरण इस समाधान को ला सकते हैं, जिसके लिए डारिन का समाधान अतिसंवेदनशील नहीं है।
रिचर्ड साज़ेले

एक ही नाम के दो इनपुट के परिणामस्वरूप एक एरे को प्रत्येक मान के लिए एक तत्व के साथ पोस्ट किया जा रहा है, न कि एक मूल्य के रूप में निहित है। इसलिए मैं चाहता हूं कि मैं अन्यथा कह सकता / सकती हूं क्योंकि मैं इसका उपयोग करने की आशा / कोशिश कर रही थी, लेकिन यह काम नहीं करता है।
क्रिस्टोफर किंग

1
@RichardSzalay - क्या आप सिर्फ <button type="submit" name="action" value="draft"> Internationalized Save Text </button>i18n प्रयोजनों के लिए उपयोग नहीं कर सकते हैं, इसलिए स्ट्रिंग का सामना कर रहे उपयोगकर्ता अनुकूलन योग्य है, और फार्म तत्व नाम सीधे उपयोगकर्ता के लिए कभी भी उजागर नहीं होते हैं (जो कि अपने आप में अजीब है)
काइलमिट

48
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />

और आपके नियंत्रक क्रिया में:

public ActionResult SomeAction(string submit)
{
    if (!string.IsNullOrEmpty(submit))
    {
        // Save was pressed
    }
    else
    {
        // Process was pressed
    }
}

1
मुझे लगता है कि अधिक बटन को केवल पैरामीटर सूची में जोड़कर और इसे सही ढंग से नाम देकर जोड़ा जा सकता है। अच्छा समाधान!
गोनियल

35

यह एक बेहतर उत्तर है, इसलिए हमारे पास एक बटन के लिए पाठ और मूल्य दोनों हो सकते हैं:

http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx

</p>
<button name="button" value="register">Register</button>
<button name="button" value="cancel">Cancel</button>
</p>

और नियंत्रक:

public ActionResult Register(string button, string userName, string email, string password, string confirmPassword)
{
if (button == "cancel")
    return RedirectToAction("Index", "Home");
...

संक्षेप में इसके SUBMIT बटन पर आप नाम की विशेषता का उपयोग करते हुए नाम चुनते हैं, तो यह और भी अधिक शक्तिशाली है क्योंकि आपका नाम नियंत्रक विधि के मापदंडों में सबमिट या बटन के लिए बाध्य नहीं है, आप इसे अपनी इच्छानुसार कॉल कर सकते हैं ...


धन्यवाद सर, यह वही है जो मुझे चाहिए
oHoodie

यह तब टूटता है जब आपके पास एक बहुभाषी प्रणाली होती है जो भाषा के अनुसार बटन के मूल्य को बदल देती है।
डेव टॅपसन

डेव - मुझे नहीं लगता कि किसी को भी इस तरह एक प्रणाली कोड होगा। यह आपके नियंत्रक नामों या फ़ंक्शन नामों को स्थानीय बनाने जैसा है। मूल्य बटन का केवल सर्वर साइड उपयोग के लिए है - यह कहीं भी प्रदर्शित नहीं करता है और स्थानीय किए जाने की जरूरत नहीं है।
निक नेग

20

आप नीचे दिए गए नाम टैग की तरह अपने बटन को पहचान सकते हैं, आपको इस तरह की जांच करने की आवश्यकता है

if (Request.Form["submit"] != null)
{
//Write your code here
}
else if (Request.Form["process"] != null)
{
//Write your code here
}

यह उन स्थितियों में बहुत मददगार होता है जब आप बटन का नाम पोस्ट एक्शन के पास नहीं देना चाहते।
योगीहोस्टिंग

इस परिदृश्य में इकाई परीक्षण में अनुरोध वर्ग का मजाक करना अधिक जटिल हो सकता है।
मुफ्लिक्स

6

यहां कस्टम मल्टीबटन एट्रिब्यूट का उपयोग करके निर्देशों का पालन करना वास्तव में आसान होने का एक अच्छा और सरल तरीका है:

http://blog.maartenballiauw.be/post/2009/11/26/Supporting-multiple-submit-buttons-on-an-ASPNET-MVC-view.aspx

संक्षेप में, इस तरह से अपने सबमिट बटन बनाएं:

<input type="submit" value="Cancel" name="action" />
<input type="submit" value="Create" name="action" /> 

इस तरह आपके कार्य:

[HttpPost]
[MultiButton(MatchFormKey="action", MatchFormValue="Cancel")]
public ActionResult Cancel()
{
    return Content("Cancel clicked");
}

[HttpPost]
[MultiButton(MatchFormKey = "action", MatchFormValue = "Create")]
public ActionResult Create(Person person)
{
    return Content("Create clicked");
} 

और इस वर्ग का निर्माण करें:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultiButtonAttribute : ActionNameSelectorAttribute
{
    public string MatchFormKey { get; set; }
    public string MatchFormValue { get; set; }

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        return controllerContext.HttpContext.Request[MatchFormKey] != null &&
            controllerContext.HttpContext.Request[MatchFormKey] == MatchFormValue;
    }
}

1
हमेशा संदर्भित लिंक को संक्षिप्त करने के लिए सबसे अच्छा है (उस दिन के लिए जो ब्लॉग गायब हो जाता है)। सारांश में कि ब्लॉग MultiButtonAttributeसबमिट बटन के बीच अंतर करने की अनुमति देने के लिए एक कस्टम विशेषता रखने की वकालत करता है । वास्तव में एक अच्छा विचार है।
कोडिंग हुई

1
और अगर Arnis L.आपने उसी सलाह का पालन किया है, तो आपने देखा होगा कि उसने ठीक उसी लिंक को 4 साल पहले प्रदान किया था:
कोडिंग किया गया

3
// Buttons
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />

// Controller
[HttpPost]
public ActionResult index(FormCollection collection)
{
    string submitType = "unknown";

    if(collection["submit"] != null)
    {
        submitType = "submit";
    }
    else if (collection["process"] != null)
    {
        submitType = "process";
    }

} // End of the index method

यह पोस्ट की गई प्रत्येक चीज़ का एक बेहतर समाधान है क्योंकि यह प्रत्येक कार्रवाई में अनुकूलित पैरामीटर सेट के बिना बहुत जटिल रूप डेटा को लगातार पारित करने की अनुमति देता है, जिससे नियंत्रक तर्क जटिल रूपों के लिए अत्यधिक अनुकूलन योग्य हो सकता है। कुदोस फ्रेड्रिक :) मेरा मानना ​​है कि यह प्रपत्र कई रूपों में पारित होगा?
स्टोकली

धन्यवाद स्टोकली। आप इस विधि को कई रूपों से कॉल कर सकते हैं, यदि आप अजाक्स कॉल करते हैं तो आप एक ही फॉर्म-कॉलिलेशन में कई रूपों को शामिल कर सकते हैं।
बजे फ्रेड्रिक स्टिग्सन

3

इसे आसान बनाने के लिए मैं कहूंगा कि आप अपने बटन को निम्न में बदल सकते हैं:

<input name="btnSubmit" type="submit" value="Save" />
<input name="btnProcess" type="submit" value="Process" />

आपका नियंत्रक:

public ActionResult Create(string btnSubmit, string btnProcess)
{
    if(btnSubmit != null)
       // do something for the Button btnSubmit
    else 
       // do something for the Button btnProcess
}

2

यह पोस्ट कॉपरमिल के लिए जवाब देने वाली नहीं है, क्योंकि उनका जवाब बहुत पहले दिया जा चुका है। मेरी पोस्ट इस तरह के समाधान के लिए कौन मददगार होगा। सबसे पहले, मुझे कहना होगा कि "डब्ल्यूडीएफ का समाधान पूरी तरह से सही है" और यह ठीक काम करता है, लेकिन मेरा समाधान (वास्तव में मेरा नहीं) अन्य तत्वों में उपयोग किया जाएगा और यह प्रस्तुति परत को नियंत्रक से अधिक स्वतंत्र बनाता है (क्योंकि आपका नियंत्रक निर्भर करता है "मान" जिसका उपयोग बटन के लेबल को दिखाने के लिए किया जाता है, यह सुविधा अन्य भाषाओं के लिए महत्वपूर्ण है।)

यहाँ मेरा समाधान है, उन्हें अलग-अलग नाम दें:

<input type="submit" name="buttonSave" value="Save"/>
<input type="submit" name="buttonProcess" value="Process"/>
<input type="submit" name="buttonCancel" value="Cancel"/>

और आपको नीचे दिए गए कार्यों में तर्क के रूप में बटन के नाम निर्दिष्ट करने होंगे:

public ActionResult Register(string buttonSave, string buttonProcess, string buttonCancel)
{
    if (buttonSave!= null)
    {
        //save is pressed
    }
    if (buttonProcess!= null)
    {
        //Process is pressed
    }
    if (buttonCancel!= null)
    {
        //Cancel is pressed
    }
}

जब उपयोगकर्ता किसी एक बटन का उपयोग करके पृष्ठ को सबमिट करता है, तो केवल एक तर्क का मूल्य होगा। मुझे लगता है कि यह दूसरों के लिए मददगार होगा।

अपडेट करें

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


कुछ रचनात्मक आलोचनाओं के साथ: यह आपकी पोस्टिंग के अनुसार मौजूदा उत्तरों द्वारा अच्छी तरह से कवर किया गया है। इसके अतिरिक्त, यह अच्छा पैमाना नहीं है। HTML केवल वह input[type=submit]मान वापस करेगा जो ट्रिगर किया गया था, इसलिए वे सभी मॉडल को उसी name(पूर्व action) के साथ एक संपत्ति से बांध सकते हैं और फिर आप valueउस स्ट्रिंग के आधार पर बटन को अलग कर सकते हैं जो आपके हस्ताक्षर में कई चर पेश करने की आवश्यकता के बिना। । कृपया पोस्ट करने से पहले फॉर्मेटिंग / इंडेंटेशन के बारे में सोचने के लिए कुछ समय लें।
काइलमिट

0

क्या आप Request.Form संग्रह का उपयोग करके पता नहीं लगा सकते हैं? यदि प्रक्रिया को क्लिक किया जाता है, तो अनुरोध करें। ["प्रक्रिया"] खाली नहीं होगी


0

दोनों बटनों को नाम दें और फॉर्म से चेक प्राप्त करें।

<div>
   <input name="submitButton" type="submit" value="Register" />
</div>

<div>
   <input name="cancelButton" type="submit" value="Cancel" />
</div>

नियंत्रक पक्ष पर:

public ActionResult Save(FormCollection form)
{
 if (this.httpContext.Request.Form["cancelButton"] !=null)
 {
   // return to the action;
 }

else if(this.httpContext.Request.Form["submitButton"] !=null)
 {
   // save the oprtation and retrun to the action;
 }
}

0

कोर 2.2 रेजर पृष्ठों में यह वाक्य रचना काम करती है:

    <button type="submit" name="Submit">Save</button>
    <button type="submit" name="Cancel">Cancel</button>
public async Task<IActionResult> OnPostAsync()
{
    if (!ModelState.IsValid)
        return Page();
    var sub = Request.Form["Submit"];
    var can = Request.Form["Cancel"];
    if (sub.Count > 0)
       {
       .......

यह काम कर सकता है, लेकिन मैं पैरामीटर string submitबनाम लेखन पसंद करता हूं string submit = Request.Form["Submit"];। रेजर पेज और / या MVC के सबसे बड़े लाभों में से एक है तरीकों की पठनीयता, अन्यथा यह PHP हो सकता है।
यजॉर्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.