आप ASP.NET MVC फ्रेमवर्क में कई सबमिट बटन कैसे हैंडल करते हैं?


733

क्या एक ही फ़ॉर्म से कई सबमिट बटन को संभालने का कुछ आसान तरीका है? उदाहरण के लिए:

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" value="Send" />
<input type="submit" value="Cancel" />
<% Html.EndForm(); %>

किसी भी विचार कैसे ASP.NET फ्रेमवर्क बीटा में ऐसा करने के लिए? उन सभी उदाहरणों के बारे में जिन्हें मैंने जाना है उनमें सिंगल बटन है।


6
ASP.NET कोर से शुरू होने वाले वर्थ का उल्लेख यहां सूचीबद्ध लोगों की तुलना में बहुत आसान है।
स्टीवन ज्यूरिस

जवाबों:


629

यहाँ Maarten Balliauw की पोस्ट और टिप्पणियों के आधार पर कई सबमिट बटन समस्या के लिए ज्यादातर स्वच्छ विशेषता-आधारित समाधान है ।

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

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        var isValidName = false;
        var keyValue = string.Format("{0}:{1}", Name, Argument);
        var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);

        if (value != null)
        {
            controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
            isValidName = true;
        }

        return isValidName;
    }
}

उस्तरा:

<form action="" method="post">
 <input type="submit" value="Save" name="action:Save" />
 <input type="submit" value="Cancel" name="action:Cancel" />
</form>

और नियंत्रक:

[HttpPost]
[MultipleButton(Name = "action", Argument = "Save")]
public ActionResult Save(MessageModel mm) { ... }

[HttpPost]
[MultipleButton(Name = "action", Argument = "Cancel")]
public ActionResult Cancel(MessageModel mm) { ... }

अद्यतन: रेजर पृष्ठ बॉक्स से समान कार्यक्षमता प्रदान करते हैं। नए विकास के लिए, यह बेहतर हो सकता है।


3
मैंने इस समाधान का उपयोग अन्य तकनीकों के सुखी विवाह के लिए किया। पूरी तरह से काम करता है और स्थानीयकरण को प्रभावित नहीं करता है।
trevorc

17
महान समाधान !! उन शीर्ष जवाबों की तुलना में बहुत अधिक उपयोगी
साशा

11
इस दृष्टिकोण के साथ एक समस्या यह है कि यदि आप return View(viewmodel)उस मामले में प्रयास करते हैं जहां आपके मॉडल में त्रुटियां हैं, तो यह आपके पास एक Sendतर्क या नाम के आधार पर देखने का प्रयास करेगा ।
जूता

15
@ शोहे - बस एक ऐसी ही चीज मिली है। सुनिश्चित करें कि यदि आप इस पद्धति का उपयोग कर रहे हैं, तो लौटने का दृश्य स्पष्ट रूप से निर्दिष्ट करें:return View("Index", viewModel)
ajbeaven

4
बस एक जानकारी के लिए, हमें System को जोड़ना होगा। MethodInfo के लिए रीफ्लेक्शन
Vignesh Subramanian

469

अपने सबमिट बटन को एक नाम दें, और फिर अपने नियंत्रक विधि में प्रस्तुत मूल्य का निरीक्षण करें:

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="submitButton" value="Send" />
<input type="submit" name="submitButton" value="Cancel" />
<% Html.EndForm(); %>

पोस्टिंग है

public class MyController : Controller {
    public ActionResult MyAction(string submitButton) {
        switch(submitButton) {
            case "Send":
                // delegate sending to another controller action
                return(Send());
            case "Cancel":
                // call another action to perform the cancellation
                return(Cancel());
            default:
                // If they've submitted the form without a submitButton, 
                // just return the view again.
                return(View());
        }
    }

    private ActionResult Cancel() {
        // process the cancellation request here.
        return(View("Cancelled"));
    }

    private ActionResult Send() {
        // perform the actual send operation here.
        return(View("SendConfirmed"));
    }

}

संपादित करें:

स्थानीय साइटों के साथ काम करने के लिए इस दृष्टिकोण का विस्तार करने के लिए, अपने संदेशों को कहीं और अलग करें (जैसे एक संसाधन फ़ाइल को जोरदार-टाइप संसाधन वर्ग में संकलित करना)

फिर कोड को संशोधित करें ताकि यह काम करे:

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="submitButton" value="<%= Html.Encode(Resources.Messages.Send)%>" />
<input type="submit" name="submitButton" value="<%=Html.Encode(Resources.Messages.Cancel)%>" />
<% Html.EndForm(); %>

और आपके नियंत्रक को इस तरह दिखना चाहिए:

// Note that the localized resources aren't constants, so 
// we can't use a switch statement.

if (submitButton == Resources.Messages.Send) { 
    // delegate sending to another controller action
    return(Send());

} else if (submitButton == Resources.Messages.Cancel) {
     // call another action to perform the cancellation
     return(Cancel());
}

28
बहुत बुरा आप बटन पर प्रदर्शित पाठ पर निर्भर करते हैं, यह एक बहुभाषी उपयोगकर्ता इंटरफ़ेस के साथ बहुत मुश्किल है
ओमू

3
स्विच / केस केवल स्थिरांक के साथ काम करता है, इसलिए स्थानीय संस्करण स्विच / केस का उपयोग नहीं कर सकता है। आपको अन्य या किसी अन्य प्रेषण विधि पर स्विच करने की आवश्यकता है।
20

10
आपको <इनपुट प्रकार के बजाय <बटन प्रकार = "सबमिट" का उपयोग करना चाहिए, क्योंकि <बटन प्रकार का मूल्य पाठ नहीं है;)। तब आपके पास कुछ इस तरह हो सकता है: <बटन का नाम = "mySubmitButton" प्रकार = "सबमिट" मान = "कीवैल्यू"> YourButtonText </ बटन>
J4N

4
यह केवल जमा मूल्य के बजाय मॉडल को कार्रवाई में कैसे काम करेगा?
bizzehdee

2
यदि आप jQuery का उपयोग कर रहे हैं तो अपने बटन "एक्शन" का नाम न दें। यह लाइब्रेरी के भीतर एक संघर्ष का कारण बनता है जो कार्रवाई URL को तोड़ता है।
हॉटन

121

जैसा कि उल्लेख किया गया है आप कार्रवाई में नाम की जांच कर सकते हैं, लेकिन आप इस पर विचार कर सकते हैं कि यह अच्छा डिज़ाइन है या नहीं। कार्रवाई की जिम्मेदारी पर विचार करना अच्छा है और इस डिज़ाइन को बहुत अधिक नहीं यूआई पहलुओं जैसे कि बटन नाम। तो 2 रूपों और 2 क्रियाओं का उपयोग करने पर विचार करें:

<% Html.BeginForm("Send", "MyController", FormMethod.Post); %>
<input type="submit" name="button" value="Send" />
<% Html.EndForm(); %>

<% Html.BeginForm("Cancel", "MyController", FormMethod.Post); %>
<input type="submit" name="button" value="Cancel" />
<% Html.EndForm(); %>

इसके अलावा, "रद्द करें" के मामले में, आप आमतौर पर फॉर्म को संसाधित नहीं कर रहे हैं और एक नए URL पर जा रहे हैं। इस स्थिति में आपको फॉर्म जमा करने की आवश्यकता नहीं है और बस एक लिंक की आवश्यकता है:

<%=Html.ActionLink("Cancel", "List", "MyController") %>

53
यह ठीक है जब आपको हर सबमिट बटन के लिए एक ही फॉर्म डेटा की आवश्यकता नहीं होती है। अगर आपको Dylan Beattie से सामान्य रूप में सभी डेटा की आवश्यकता है, तो जाने का रास्ता है। क्या ऐसा करने का कोई और सुरुचिपूर्ण तरीका है?
जिदाने

3
दृश्य प्रस्तुति के बारे में, इस मामले में "रद्द करें" बटन के बगल में "भेजें" बटन कैसे है?
क्रिश- I

1
डायलन: रद्द बटन के लिए अच्छी तरह से आपको डेटा जमा करने की आवश्यकता नहीं है और नियंत्रक को यूआई तत्वों के साथ जोड़े रखना बुरा है। हालाँकि यदि आप अधिक या कम सामान्य "कमांड" बना सकते हैं तो मुझे लगता है कि यह ठीक है, लेकिन मैं इसे "submitButton" में नहीं बाँधूंगा क्योंकि यह एक UI तत्व का नाम है।
ट्रेवर डे कोएकोक

1
@ क्रिस: आप अपने बटनों को सीएसएस के साथ रख सकते हैं और वे अभी भी 2 अलग-अलग फॉर्म सेक्शन में निवास कर सकते हैं।
ट्रेवर डे कोएकोक

8
गंभीरता से? किसी को भी मुझे नहीं सूंघता है ?!

98

Eilon का सुझाव है कि आप इसे इस तरह से कर सकते हैं:

यदि आपके पास एक से अधिक बटन हैं, तो आप प्रत्येक बटन को एक नाम देकर उनके बीच अंतर कर सकते हैं:

<input type="submit" name="SaveButton" value="Save data" />
<input type="submit" name="CancelButton" value="Cancel and go back to main page" />

अपनी कंट्रोलर एक्शन विधि में आप HTML इनपुट टैग नामों के नाम के पैरामीटर जोड़ सकते हैं:

public ActionResult DoSomeStuff(string saveButton, string
cancelButton, ... other parameters ...)
{ ... }

यदि कोई मान उन मापदंडों में से किसी एक पर पोस्ट हो जाता है, तो इसका मतलब है कि बटन वह था जो क्लिक किया गया था। वेब ब्राउज़र केवल एक बटन के लिए एक मूल्य पोस्ट करेगा जो क्लिक किया गया। अन्य सभी मूल्य शून्य होंगे।

if (saveButton != null) { /* do save logic */ }
if (cancelButton != null) { /* do cancel logic */ }

मुझे यह तरीका पसंद है क्योंकि यह सबमिट बटन की मूल्य संपत्ति पर निर्भर नहीं करता है जो असाइन किए गए नामों की तुलना में बदलने की अधिक संभावना है और इसके लिए जावास्क्रिप्ट सक्षम करने की आवश्यकता नहीं है

देखें: http://forums.asp.net/p/1369617/2865166.aspx#2865166


2
यदि कोई भी इस पुराने प्रश्न पर आता है, तो यह सबसे साफ उत्तर है यदि आप HTML5 <बटन> तत्वों का उपयोग नहीं करते हैं। यदि आप HTML5 को बुरा नहीं मानते हैं, तो मान विशेषता के साथ <बटन> का उपयोग करें।
कुगेल

अगर आप इस फॉर्म पर अजाक्स कॉल करते हैं तो आप इसे कैसे करेंगे। ऐसा लगता है कि फ़ॉर्म .serialize () पिक नाम सबमिट नहीं करता है ..
mko

@Kugel सही है, यह अभी भी सबसे साफ जवाब है। धन्यवाद
आरिफ यिल्माज़

45

इसके बारे में एक पोस्ट में लिखा है: ASP.NET MVC के साथ एकाधिक सबमिट बटन :

मूल रूप से, उपयोग करने के बजाय ActionMethodSelectorAttribute, मैं उपयोग कर रहा हूं ActionNameSelectorAttribute, जो मुझे कार्रवाई नाम का दिखावा करने की अनुमति देता है जो भी मैं चाहता हूं कि वह हो। सौभाग्य से, ActionNameSelectorAttributeकेवल मुझे कार्रवाई का नाम निर्दिष्ट करने के लिए नहीं बनाता है, इसके बजाय मैं चुन सकता हूं कि क्या वर्तमान कार्रवाई अनुरोध से मेल खाती है।

तो मेरी कक्षा है (btw मैं नाम का बहुत शौकीन नहीं हूँ):

public class HttpParamActionAttribute : ActionNameSelectorAttribute {
    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) {
        if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
            return true;

        if (!actionName.Equals("Action", StringComparison.InvariantCultureIgnoreCase))
            return false;

        var request = controllerContext.RequestContext.HttpContext.Request;
        return request[methodInfo.Name] != null;
    }
} 

इस तरह से एक फार्म को परिभाषित करने के लिए उपयोग करने के लिए:

<% using (Html.BeginForm("Action", "Post")) { %>
  <!— form fields -->
  <input type="submit" name="saveDraft" value="Save Draft" />
  <input type="submit" name="publish" value="Publish" />
<% } %> 

और दो तरीकों के साथ नियंत्रक

public class PostController : Controller {
    [HttpParamAction]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult SaveDraft(…) {
        //…
    }

    [HttpParamAction]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Publish(…) {
        //…
    } 
}

जैसा कि आप देखते हैं, विशेषता को आपको कुछ भी निर्दिष्ट करने की आवश्यकता नहीं है। इसके अलावा, बटन का नाम सीधे विधि के नामों में अनुवादित होता है। इसके अतिरिक्त (मैंने कोशिश नहीं की है कि) ये सामान्य क्रियाओं के रूप में भी काम करें, ताकि आप उनमें से किसी पर भी पोस्ट कर सकें।


1
सुंदर! मुझे लगता है कि यह सबसे सुंदर समाधान है। यह विचार से टैग के मूल्य को समाप्त कर देता है submit, जो आदर्श है क्योंकि यह शुद्ध-यूआई विशेषता है जिसका नियंत्रण-प्रवाह पर कोई असर नहीं होना चाहिए। इसके बजाय, nameप्रत्येक submitटैग की अनूठी विशेषता सीधे आपके नियंत्रक पर असतत कार्रवाई पद्धति में अनुवाद करती है।
कर्क वॉक

+1 मेरे लिए, यह इस समस्या का सबसे अच्छा समाधान है। जब से मैंने इसे लागू किया है, मैंने देखा है कि बहुत से ट्रैफ़िक HttpParamActionAttribut से गुजरते हैं लेकिन अन्य सभी चीजों की तुलना में जो Asp.Net MVC को अनुरोध संसाधित करते समय करनी होती है, यह पूरी तरह स्वीकार्य है। केवल हैक करने के लिए मुझे अपने कंट्रोलर में एक खाली 'एक्शन' डालना होगा, जिसे रोकने के लिए मुझे चेतावनी दी जाए कि एक्शन 'एक्शन' मौजूद नहीं है। आपका बहुत बहुत धन्यवाद!
शमूएल

मैंने सभी समाधानों की समीक्षा की और यह भी माना कि यह एक अच्छा सुरुचिपूर्ण, सरल समाधान है। महान ई.पू. कोई सशर्त विवरण और मजबूत नहीं हैं जहां आप एक नया बटन होने पर एक नई नियंत्रक कार्रवाई को परिभाषित कर सकते हैं। मेरी क्लास को मल्टीबटनअशनहैंडलर FYI ;-)
ejhost

36

यह छोटा और स्वीट है:

इसका जवाब जीरो डोप ने दिया था

<input type="submit" name="submitbutton1" value="submit1" />
<input type="submit" name="submitbutton2" value="submit2" />

और कोड के पीछे इस तरह से करते हैं

 if( Request.Form["submitbutton1"] != null)
{
    // Code for function 1
}
else if(Request.Form["submitButton2"] != null )
{
       // code for function 2
}

सौभाग्य।


बहुत बढ़िया। ठीक वैसा ही जैसा मैं वेबफॉर्म में करता था। चीयर्स मित्र
djack109

शीर्ष उत्तर की तुलना में बहुत अधिक सरल! धन्यवाद!
पाबेनबेन

35

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

यदि लिंक विघटित हो जाता है, तो यह MultiButtonएक नियंत्रक क्रिया पर लागू विशेषता का उपयोग करके यह इंगित करने के लिए है कि कौन सा बटन उस क्रिया से संबंधित होना चाहिए।


यह समाधान है जो हम अभी और इसके बहुत साफ उपयोग कर रहे हैं। क्या यह एमवीसी 2 ही है?
साइमन कीप

ये सुन्दर है! मैं यह पहले नहीं देखा था! हालांकि मैं मानता हूं कि आप किसी भी समाधान को फिर से डिज़ाइन करना चाहते हैं जो कई सबमिट का उपयोग केवल एक बटन का उपयोग करने के लिए कर रहा है, मैं उस जगह पर हूं जहां मैं हैमस्ट्रिंग हूं और मुझे यह करना चाहिए। इस जवाब को जीतना चाहिए था!
रिकॉन

यह एक बेहतरीन उपाय है। बहुत साफ
Arnej65

इस दृष्टिकोण की कोशिश की और MVC3 में काम करने में सक्षम नहीं था। # 1 वोट पाने वाले का एक रूपांतर मेरे लिए काम कर गया।
स्कॉट लॉरेंस

छोटा और मीठा .. लेकिन mvc 3+ के लिए नहीं
पियोत्र कुला

21

आपको बटन को नाम देने और उन्हें एक मूल्य देने में सक्षम होना चाहिए; फिर इस नाम को कार्रवाई के तर्क के रूप में मैप करें। वैकल्पिक रूप से, 2 अलग-अलग एक्शन-लिंक या 2 फॉर्म का उपयोग करें।


अब तक सबसे साफ, और सबसे आसान, समाधान मैंने देखा है।
जेसन इवांस

13

आप लिख सकते हैं:

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="button" value="Send" />
<input type="submit" name="button" value="Cancel" />
<% Html.EndForm(); %>

और फिर पेज में देखें कि क्या नाम == "भेजें" या नाम == "रद्द करें" ...


1
हालांकि यह काम कर रहा है, लेकिन मुझे लगता है कि एक ही नाम के दो तत्व होना गलत है।
पेर्ट

1
यह गलत नहीं है। यह निर्भर करता है कि आप कैसे इनपुट्स का उपयोग कर रहे हैं। आपके पास एक ही नाम के साथ कई तत्व हो सकते हैं, और कई डेटा प्राप्त करने की उम्मीद कर सकते हैं (यह है कि रेडियोबुटन और चेकबॉक्स कैसे काम करते हैं)। लेकिन हाँ, अगर आप इस विधि का उपयोग कर रहे हैं, क्योंकि आप इसे "गलत" कर रहे हैं ... यही कारण है कि मैंने "आप कर सकते हैं" लेकिन "आपको चाहिए" नहीं: पी
आइरिशनेट

12

ActionSelectName के बारे में मुझे कुछ पसंद नहीं है, यह है कि IsValidName को कंट्रोलर में हर एक्शन विधि के लिए कहा जाता है; मुझे नहीं पता कि यह इस तरह से क्यों काम करता है। मुझे एक समाधान पसंद है जहां हर बटन का नाम अलग-अलग होता है जो वह करता है, लेकिन मुझे यह पसंद नहीं है कि आपके पास कार्रवाई विधि में कई पैरामीटर हैं जैसे कि बटन। मैंने सभी प्रकार के बटन के लिए एक एनम बनाया है:

public enum ButtonType
{
    Submit,
    Cancel,
    Delete
}

ActionSelectName के बजाय, मैं एक ActionFilter का उपयोग करता हूं:

public class MultipleButtonsEnumAttribute : ActionFilterAttribute
{
    public Type EnumType { get; set; }

    public MultipleButtonsEnumAttribute(Type enumType)
    {
        EnumType = enumType;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        foreach (var key in filterContext.HttpContext.Request.Form.AllKeys)
        {
            if (Enum.IsDefined(EnumType, key))
            {
                var pDesc = filterContext.ActionDescriptor.GetParameters()
                    .FirstOrDefault(x => x.ParameterType == EnumType);
                filterContext.ActionParameters[pDesc.ParameterName] = Enum.Parse(EnumType, key);
                break;
            }
        }
    }
}

फ़िल्टर को प्रपत्र डेटा में बटन का नाम मिलेगा और यदि बटन का नाम एनम में परिभाषित किसी भी प्रकार के बटन से मेल खाता है, तो यह कार्रवाई मापदंडों के बीच बटन टाइप पैरामीटर को ढूंढेगा:

[MultipleButtonsEnumAttribute(typeof(ButtonType))]
public ActionResult Manage(ButtonType buttonPressed, ManageViewModel model)
{
    if (button == ButtonType.Cancel)
    {
        return RedirectToAction("Index", "Home");
    }
    //and so on
    return View(model)
}

और फिर विचारों में, मैं उपयोग कर सकता हूं:

<input type="submit" value="Button Cancel" name="@ButtonType.Cancel" />
<input type="submit" value="Button Submit" name="@ButtonType.Submit" />

11

यहाँ मेरे लिए सबसे अच्छा काम करता है:

<input type="submit" value="Delete" name="onDelete" />
<input type="submit" value="Save" name="onSave" />


public ActionResult Practice(MyModel model, string onSave, string onDelete)
{
    if (onDelete != null)
    {
        // Delete the object
        ...
        return EmptyResult();
    }

    // Save the object
    ...
    return EmptyResult();
}

मैं नियंत्रक विधि में onDelete और onSave के लिए शून्य मान प्राप्त करता हूं। तुम जानते हो क्यों?
दिगंत कुमार

यदि आप बटन के अनुसार क्लिक करते हैं तो कोई भी अशक्त नहीं होगा। आप कौन सा बटन दबाए हुए हैं?
सर्गेई

11

मैं इस 'समस्या' के रूप में अच्छी तरह से आया हूं, लेकिन nameविशेषता को जोड़कर एक तार्किक समाधान पाया । मैं अन्य भाषाओं में इस समस्या को याद नहीं कर सका।

http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2

  • ...
  • यदि किसी फ़ॉर्म में एक से अधिक सबमिट बटन हैं, तो केवल सक्रिय सबमिट बटन सफल है।
  • ...

मतलब निम्नलिखित कोड valueविशेषताओं को परिवर्तित किया जा सकता है, स्थानीयकृत, अंतर्राष्ट्रीयकृत, अतिरिक्त कोड की आवश्यकता के बिना दृढ़ता से टाइप की गई संसाधन फ़ाइलों या स्थिरांक की जाँच करना।

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="send" value="Send" />
<input type="submit" name="cancel" value="Cancel" />
<input type="submit" name="draft" value="Save as draft" />
<% Html.EndForm(); %>`

प्राप्त होने के अंत में आपको केवल यह जांचने की आवश्यकता होगी कि आपका कोई ज्ञात सबमिट प्रकार नहीं है या नहीं null

public ActionResult YourAction(YourModel model) {

    if(Request["send"] != null) {

        // we got a send

    }else if(Request["cancel"]) {

        // we got a cancel, but would you really want to post data for this?

    }else if(Request["draft"]) {

        // we got a draft

    }

}

यह एक समाधान है जिसे हमने एक साधारण वेब ऐप के लिए उपयोग करने के लिए चुना है जहां हम ASP.NET WebForms कार्यक्षमता चाहते हैं लेकिन MVC के भीतर।
ब्रैंडनगॉव

10

यदि आपके पास HTML 5 के उपयोग पर प्रतिबंध नहीं है, तो आप विशेषता के <button>साथ टैग का उपयोग कर सकते हैं formaction:

<form action="demo_form.asp" method="get">
   First name: <input type="text" name="fname" /><br />
   Last name: <input type="text" name="lname" /><br />
   <button type="submit">Submit</button><br />
   <button type="submit" formaction="demo_admin.asp">Submit as admin</button>
</form>

संदर्भ: http://www.w3schools.com/html5/att_button_formaction.asp


9

यदि आपका ब्राउज़र इनपुट बटन (IE 10+, अन्य ब्राउज़रों के बारे में निश्चित नहीं है) के लिए विशेषता निर्माण का समर्थन करता है, तो निम्नलिखित काम करना चाहिए:

@using (Html.BeginForm()){
    //put form inputs here

<input id="sendBtn" value="Send" type="submit" formaction="@Url.Action("Name Of Send Action")" />

<input id="cancelBtn" value="Cancel" type="submit" formaction="@Url.Action("Name of Cancel Action") />

}

नीचे मेरे जवाब पर एक नज़र डालें, यह ड्राफ्ट विनिर्देशों पर निर्भर नहीं करता है। आपका उत्तर संभावना को अलग-अलग कार्य करने की अनुमति देता है, जो मेरा नहीं है।
टॉम हॉफमैन

9

तीन तरीके हैं जिनके द्वारा आप उपरोक्त मुद्दे को हल कर सकते हैं

  1. HTML तरीका
  2. जेकरी रास्ता
  3. "ActionNameSelectorAttribute" तरीका

नीचे एक वीडियो है जो प्रदर्शनकारी तरीके से तीनों दृष्टिकोणों को संक्षेप में प्रस्तुत करता है।

https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940

HTML तरीका: -

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

<form action="Action1" method=post>
<input type=”submit name=”Submit1”/>
</form>

<form action="Action2" method=post>
<input type=”submit name=”Submit2”>
</form>

अजाक्स रास्ता: -

यदि आप एक अजाक्स प्रेमी हैं तो यह दूसरा विकल्प आपको अधिक उत्साहित करेगा। अजाक्स तरीके से हम दो अलग-अलग फ़ंक्शन "फन 1" और "फन 1" बना सकते हैं, नीचे दिए गए कोड को देखें। ये कार्य JQUERY या किसी अन्य ढांचे का उपयोग करके अजाक्स कॉल करेंगे। इनमें से प्रत्येक फ़ंक्शन "सबमिट" बटन के "ऑनक्लिक" इवेंट के साथ बांधा गया है। इनमें से प्रत्येक फ़ंक्शन संबंधित कार्रवाई नामों को कॉल करता है।

<Script language="javascript">
function Fun1()
{
$.post(“/Action1”,null,CallBack1);
}
function Fun2()
{
$.post(“/Action2”,null,CallBack2);
}
</Script>

<form action="/Action1" method=post>
<input type=submit name=sub1 onclick=”Fun2()”/>
</form>
<form action="/Action2" method=post>
<input type=submit name=sub2 onclick=”Fun1()”/>
</form>

"ActionNameSelectorAttribute" का उपयोग करना: -

यह एक बेहतरीन और साफ विकल्प है। "ActionNameSelectorAttribute" एक साधारण विशेषता वर्ग है जहाँ हम निर्णय लेने के तर्क लिख सकते हैं जो यह तय करेगा कि किस क्रिया को निष्पादित किया जा सकता है।

इसलिए पहली बात HTML में हमें सर्वर पर उन्हें पहचानने के लिए उचित नाम प्रस्तुत करने के लिए बटन लगाने की आवश्यकता है।

आप देख सकते हैं कि हमने बटन नामों में "सेव" और "डिलीट" कर दिया है। इसके अलावा, आप उस कार्रवाई को देख सकते हैं जिसे हमने केवल "ग्राहक" नाम दिया है, न कि किसी विशेष क्रिया नाम पर। हम उम्मीद करते हैं कि कार्रवाई का नाम "ActionNameSelectorAttribute" द्वारा तय किया जाएगा।

<form action=”Customer method=post>
<input type=submit value="Save" name="Save" /> <br />
<input type=submit value="Delete" name="Delete"/>
</form>

इसलिए जब सबमिट बटन पर क्लिक किया जाता है, तो यह पहले "ActionNameSelector" विशेषता को हिट करता है और फिर यह निर्भर करता है कि कौन सा सबमिट निकाल दिया गया है जो उचित कार्रवाई को आमंत्रित करता है।

यहां छवि विवरण दर्ज करें

तो पहला कदम एक वर्ग बनाना है जो "ActionNameSelectorAttribute" वर्ग से विरासत में मिला है। इस वर्ग में हमने एक सरल संपत्ति "नाम" बनाई है।

हमें "IsValidName" फ़ंक्शन को ओवरराइड करने की भी आवश्यकता है जो सही या वापस लौटाता है। यह फ़ंक्शन वह है जहां हम तर्क लिखते हैं कि क्या किसी कार्रवाई को निष्पादित करना है या नहीं। इसलिए यदि यह फ़ंक्शन सही है, तो कार्रवाई निष्पादित की जाती है या यह नहीं है।

public class SubmitButtonSelector : ActionNameSelectorAttribute
    {
        public string Name { get; set; }
        public override bool IsValidName(ControllerContext controllerContext, string actionName, System.Reflection.MethodInfo methodInfo)
        {
            // Try to find out if the name exists in the data sent from form
var value = controllerContext.Controller.ValueProvider.GetValue(Name);
            if (value != null)
            {
                return true;
            }
            return false;

        }
    }

उपरोक्त फ़ंक्शन का मुख्य दिल नीचे दिए गए कोड में है। "ValueProvider" संग्रह में फॉर्म से पोस्ट किए गए सभी डेटा हैं। इसलिए यह पहली बार "नाम" मान को देखता है और यदि HTTP अनुरोध में पाया गया है तो यह सही है या फिर यह गलत है।

var value = controllerContext.Controller.ValueProvider.GetValue(Name);
if (value != null)
      {
        return true;
      }
      return false;

इस विशेषता वर्ग को फिर संबंधित कार्रवाई पर सजाया जा सकता है और संबंधित "नाम" मूल्य प्रदान किया जा सकता है। इसलिए यदि सबमिट इस कार्रवाई को रोक रहा है और यदि HTML नाम का बटन मैच के नाम से मेल खाता है, तो कार्रवाई को आगे निष्पादित करता है या फिर ऐसा नहीं करता है।

public class CustomerController : Controller
{
        [SubmitButtonSelector(Name="Save")]
        public ActionResult Save()
        {
            return Content("Save Called");
        }
        [SubmitButtonSelector(Name = "Delete")]
        public ActionResult Delete()
        {
            return Content("Delete Called");
        }
}

7

डेविड फाइंडली अपने ASP.Net वेबलॉग पर ऐसा करने के लिए आपके पास 3 अलग-अलग विकल्प लिखते हैं।

यह पढ़ो उसके समाधान, और प्रत्येक के फायदे और नुकसान को देखने के लिए एक ही रूप में कई बटन । IMHO वह एक बहुत ही सुंदर समाधान प्रदान करता है जो उन विशेषताओं का उपयोग करता है जिन्हें आप अपनी कार्रवाई के साथ सजाते हैं।


7

यह वह तकनीक है जिसका मैं उपयोग करूंगा और मैं इसे अभी तक यहां नहीं देख पाया हूं। इस समाधान को प्रेरित करने वाले लिंक (साजिद इस्माइल द्वारा पोस्ट) http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form है .aspx ) का उपयोग करें। यह बिना किसी समस्या के स्थानीयकरण करने के लिए डायलन बीट्टी के उत्तर को स्वीकार करता है।

दृश्य में:

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<button name="button" value="send"><%: Resources.Messages.Send %></button>
<button name="button" value="cancel"><%: Resources.Messages.Cancel %></button>
<% Html.EndForm(); %>

नियंत्रक में:

public class MyController : Controller 
{
    public ActionResult MyAction(string button)
    {
         switch(button)
         {
             case "send":
                 this.DoSend();
                 break;
             case "cancel":
                 this.DoCancel();
                 break;
         }
    }
}

इस समाधान की तरह लग रहा है प्रदान की विडंबना।
क्रिस वैन डेर मस्त

निश्चित रूप से समान है, लेकिन यह स्थानीयकरण और नियंत्रक कोड दोनों को दिखाता है, जो कुछ ऐसा है जिसे मैंने इस धागे में इस तरह से नहीं देखा है। मुझे यह धागा मिल गया जबकि यह कैसे करना है और यह दस्तावेज करना चाहता था कि मैं किसी और के लिए क्या करूं जो एक ही नाव में हो।
मलबे

1
वास्तव में, यह विडंबना से परे नहीं है। वह <input>तत्वों का उपयोग करता है। मैं उपयोग करता हूं <button>, जिसे चर मूल्य विशेषताओं के बिना स्थानीयकरण करना आवश्यक है।
11

7

यह स्क्रिप्ट डेटा-फ़ॉर्म-एक्शन विशेषता को निर्दिष्ट करने की अनुमति देती है जो सभी ब्राउज़रों में HTML5 फॉर्मेशन विशेषता के रूप में काम करेगी (विनीत तरीके से):

$(document).on('click', '[type="submit"][data-form-action]', function(event) {
    var $this = $(this),
    var formAction = $this.attr('data-form-action'),
    $form = $($this.closest('form'));
    $form.attr('action', formAction);             
});

बटन वाले फॉर्म को डेटा-फॉर्म-एक्शन विशेषता में निर्दिष्ट URL पर पोस्ट किया जाएगा:

<button type="submit" data-form-action="different/url">Submit</button>   

इसके लिए jQuery 1.7 की आवश्यकता है। पिछले संस्करणों के लिए आपको live()इसके बजाय उपयोग करना चाहिए on()


6

यहाँ एक विस्तार विधि है जो मैंने कई छवि और / या टेक्स्ट बटन को संभालने के लिए लिखी है।

यहाँ एक छवि बटन के लिए HTML है:

<input id="btnJoin" name="Join" src="/content/images/buttons/btnJoin.png" 
       type="image">

या टेक्स्ट सबमिट बटन के लिए:

<input type="submit" class="ui-button green" name="Submit_Join" value="Add to cart"  />
<input type="submit" class="ui-button red" name="Submit_Skip" value="Not today"  />

यहाँ विस्तार विधि है जिसे आप नियंत्रक से कहते हैं form.GetSubmitButtonName()। छवि बटन के लिए यह एक फॉर्म पैरामीटर के लिए दिखता है .x(जो इंगित करता है कि एक छवि बटन क्लिक किया गया था) और नाम निकालता है। नियमित inputबटन के लिए यह एक नाम से शुरू होता है Submit_और बाद में से कमांड को निकालता है। क्योंकि मैं 'कमांड' निर्धारित करने के तर्क को दूर कर रहा हूं, आप सर्वर साइड कोड को बदले बिना क्लाइंट पर इमेज + टेक्स्ट बटन के बीच स्विच कर सकते हैं।

public static class FormCollectionExtensions
{
    public static string GetSubmitButtonName(this FormCollection formCollection)
    {
        return GetSubmitButtonName(formCollection, true);
    }

    public static string GetSubmitButtonName(this FormCollection formCollection, bool throwOnError)
    {
        var imageButton = formCollection.Keys.OfType<string>().Where(x => x.EndsWith(".x")).SingleOrDefault();
        var textButton = formCollection.Keys.OfType<string>().Where(x => x.StartsWith("Submit_")).SingleOrDefault();

        if (textButton != null)
        {
            return textButton.Substring("Submit_".Length);
        }

        // we got something like AddToCart.x
        if (imageButton != null)
        {
            return imageButton.Substring(0, imageButton.Length - 2);
        }

        if (throwOnError)
        {
            throw new ApplicationException("No button found");
        }
        else
        {
            return null;
        }
    }
}

नोट: टेक्स्ट बटन के लिए आपको नाम के साथ उपसर्ग करना होगा Submit_। मैं इस तरह से पसंद करता हूं क्योंकि इसका मतलब है कि आप कोड को बदलने के बिना पाठ (प्रदर्शन) मान को बदल सकते हैं। SELECTतत्वों के विपरीत , एक INPUTबटन में केवल एक 'मूल्य' और कोई अलग 'पाठ' विशेषता नहीं होती है। मेरे बटन अलग-अलग संदर्भों के तहत अलग-अलग बातें कहते हैं - लेकिन एक ही 'कमांड' में मैप करते हैं। मैं कोड के लिए कोड रखने की तुलना में इस तरह से नाम निकालना पसंद करता हूं == "Add to cart"


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

6

मेरे पास सही जगह पर टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है, लेकिन मैंने पूरा दिन इस पर बिताया ताकि मैं इसे साझा करना चाहता हूं।

"MultipleButtonAttribute" समाधान ValueProvider.GetValue(keyValue)को गलत तरीके से लागू करने का प्रयास करते समयnull

यह पता चला कि मैं System.Web.MVC संस्करण 3.0 का संदर्भ दे रहा था जब यह 4.0 होना चाहिए था (अन्य असेंबली 4.0 हैं)। मुझे नहीं पता कि मेरी परियोजना सही तरीके से अपग्रेड क्यों नहीं हुई और मुझे कोई अन्य स्पष्ट समस्या नहीं थी।

इसलिए यदि आपका ActionNameSelectorAttributeकाम नहीं हो रहा है ... तो जांच लें।


6

मुझे पार्टी में बहुत देर हो चुकी है, लेकिन यहाँ जाता है ... मेरा कार्यान्वयन @mkozicki से उधार लेता है, लेकिन गलत पाने के लिए कम हार्डकोड स्ट्रिंग्स की आवश्यकता होती है। फ्रेमवर्क 4.5+ आवश्यक । अनिवार्य रूप से, नियंत्रक विधि का नाम रूटिंग की कुंजी होना चाहिए।

मार्कअप । बटन नाम के साथ कुंजीबद्ध होना चाहिए"action:[controllerMethodName]"

(सी # 6 नेमॉफ एपीआई के उपयोग पर ध्यान दें, नियंत्रक विधि के नाम के प्रकार-विशिष्ट संदर्भ प्रदान करना जिसे आप आमंत्रित करना चाहते हैं।

<form>
    ... form fields ....
    <button name="action:@nameof(MyApp.Controllers.MyController.FundDeathStar)" type="submit" formmethod="post">Fund Death Star</button>
    <button name="action:@nameof(MyApp.Controllers.MyController.HireBoba)" type="submit" formmethod="post">Hire Boba Fett</button>
</form>

नियंत्रक :

namespace MyApp.Controllers
{
    class MyController
    {    
        [SubmitActionToThisMethod]
        public async Task<ActionResult> FundDeathStar(ImperialModel model)
        {
            await TrainStormTroopers();
            return View();
        }

        [SubmitActionToThisMethod]
        public async Task<ActionResult> HireBoba(ImperialModel model)
        {
            await RepairSlave1();
            return View();
        }
    }
}

जादू की विशेषताCallerMemberNameअच्छाई के उपयोग पर ध्यान दें ।

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class SubmitActionToThisMethodAttribute : ActionNameSelectorAttribute
{        
    public SubmitActionToThisMethodAttribute([CallerMemberName]string ControllerMethodName = "")
    {
        controllerMethod = ControllerMethodName;
        actionFormat = string.Concat(actionConstant, ":", controllerMethod);
    }
    const string actionConstant = "action";
    readonly string actionFormat;
    readonly string controllerMethod;

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        var isValidName = false;
        var value = controllerContext.Controller.ValueProvider.GetValue(actionFormat);

        if (value != null)
        {
            controllerContext.Controller.ControllerContext.RouteData.Values[actionConstant] = controllerMethod;
            isValidName = true;
        }
        return isValidName;
    }
}

हालांकि यह एक अच्छा तरीका है, आप बिल्ट इन एमएक्स मॉडल बाइंडर का उपयोग नहीं कर पाएंगे क्योंकि यह बटन "नाम" विशेषता का उपयोग करता है।
ooXei1sh

इस समाधान का उद्देश्य MVC पोस्ट रूटिंग के आसपास का कार्य है। कृपया सुधार का वर्णन करें।
हारून हडॉन

6
[HttpPost]
public ActionResult ConfirmMobile(string nameValueResend, string nameValueSubmit, RegisterModel model)
    {
        var button = nameValueResend ?? nameValueSubmit;
        if (button == "Resend")
        {

        }
        else
        {

        }
    }


    Razor file Content:
    @using (Html.BeginForm()
    {
        <div class="page registration-result-page">

            <div class="page-title">
                <h1> Confirm Mobile Number</h1>
            </div>

            <div class="result">
                @Html.EditorFor(model => model.VefificationCode)
                @Html.LabelFor(model => model.VefificationCode, new { })
                @Html.ValidationMessageFor(model => model.VefificationCode)
            </div>
            <div class="buttons">
                <button type="submit" class="btn" name="nameValueResend" value="Resend">
                    Resend
                </button>
                <button type="submit" class="btn" name="nameValueSubmit" value="Verify">
                    Submit
                </button>

            </div>
            </div>

    }

यह फॉर्म पोस्ट के विभिन्न तरीकों की व्याख्या करने वाला एक और उपयोगी लिंक है
हिमालय गर्ग

5

मैंने सभी समाधानों का संश्लेषण करने की कोशिश की है और एक [ब्यूटेनहैंडलर] विशेषता बनाई है जो एक फॉर्म पर कई बटनों को संभालना आसान बनाता है।

मैंने इसे ASP.NET MVC में कोडप्रोजेक्ट मल्टीपल पैरामीटरलाइज्ड (स्थानीय) फॉर्म बटन पर वर्णित किया है ।

इस बटन के साधारण मामले को संभालने के लिए:

<button type="submit" name="AddDepartment">Add Department</button>

आपके पास निम्न क्रिया विधि जैसी कोई चीज़ होगी:

[ButtonHandler()]
public ActionResult AddDepartment(Company model)
{
    model.Departments.Add(new Department());
    return View(model);
}

ध्यान दें कि बटन का नाम क्रिया विधि के नाम से कैसे मेल खाता है। लेख में यह भी बताया गया है कि मूल्यों के साथ बटन और अनुक्रमित के साथ बटन कैसे हैं।


5
//model
    public class input_element
        {
         public string Btn { get; set; }
        }   

//views--submit btn can be input type also...
    @using (Html.BeginForm())
    {
            <button type="submit" name="btn" value="verify">
             Verify data</button>
            <button type="submit" name="btn" value="save">
             Save data</button>    
            <button type="submit" name="btn" value="redirect">
                 Redirect</button>
    }

//controller

    public ActionResult About()
        {
            ViewBag.Message = "Your app description page.";
            return View();
        }

        [HttpPost]
        public ActionResult About(input_element model)
        {
                if (model.Btn == "verify")
                {
                // the Verify button was clicked
                }
                else if (model.Btn == "save")
                {
                // the Save button was clicked
                } 
                else if (model.Btn == "redirect")
                {
                // the Redirect button was clicked
                } 
                return View();
        }

आपको इसका अहसास नहीं हुआ होगा, लेकिन इस सवाल का जवाब कुछ समय पहले ही दिया गया था।
एंड्रयू बार्बर

2
इसके अलावा, आप ऐसे उत्तर पोस्ट करते हैं जिनमें केवल कोड होता है, जिसमें कोई स्पष्टीकरण नहीं होता है। क्या आप यह बताने के लिए कुछ कथनों को जोड़ने पर विचार करेंगे कि कोड क्यों काम करता है, और यह सवाल का जवाब क्या देता है? यह सवाल पूछने वाले व्यक्ति, और साथ आने वाले किसी अन्य व्यक्ति के लिए बहुत मददगार होगा।
एंड्रयू बार्बर

2
ज़रूर, यह ठीक काम करता है। लेकिन वह जवाब दूसरों ने पहले ही दे दिया है । और उन्होंने इस बारे में स्पष्टीकरण भी शामिल किया कि यह क्यों काम करता है।
एंड्रयू बार्बर

5

यह सबसे अच्छा तरीका है जो मैंने पाया है:

http://iwayneo.blogspot.co.uk/2013/10/aspnet-mvc-action-selector-with-list.html

यहाँ कोड है:

    /// <summary>
    /// ActionMethodSelector to enable submit buttons to execute specific action methods.
    /// </summary>
    public class AcceptParameterAttribute : ActionMethodSelectorAttribute
   {
        /// <summary>
        /// Gets or sets the value to use to inject the index into
        /// </summary>
       public string TargetArgument { get; set; }

       /// <summary>
       /// Gets or sets the value to use in submit button to identify which method to select. This must be unique in each controller.
       /// </summary>
       public string Action { get; set; }

       /// <summary>
       /// Gets or sets the regular expression to match the action.
       /// </summary>
       public string ActionRegex { get; set; }

       /// <summary>
       /// Determines whether the action method selection is valid for the specified controller context.
       /// </summary>
       /// <param name="controllerContext">The controller context.</param>
       /// <param name="methodInfo">Information about the action method.</param>
       /// <returns>true if the action method selection is valid for the specified controller context; otherwise, false.</returns>
       public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
       {

           if (controllerContext == null)
           {
               throw new ArgumentNullException("controllerContext");
           }

           Func<NameValueCollection> formGetter;
           Func<NameValueCollection> queryStringGetter;

           ValidationUtility.GetUnvalidatedCollections(HttpContext.Current, out formGetter, out queryStringGetter);

           var form = formGetter();
           var queryString = queryStringGetter();

           var req = form.AllKeys.Any() ? form : queryString;

           if (!string.IsNullOrEmpty(this.ActionRegex))
           {
               foreach (var key in req.AllKeys.Where(k => k.StartsWith(Action, true, System.Threading.Thread.CurrentThread.CurrentCulture)))
               {
                   if (key.Contains(":"))
                   {
                       if (key.Split(':').Count() == this.ActionRegex.Split(':').Count())
                       {
                           bool match = false;
                           for (int i = 0; i < key.Split(':').Count(); i++)
                           {
                               if (Regex.IsMatch(key.Split(':')[0], this.ActionRegex.Split(':')[0]))
                               {
                                   match = true;
                               }
                               else
                               {
                                   match = false;
                                   break;
                               }
                           }

                           if (match)
                           {
                               return !string.IsNullOrEmpty(req[key]);
                           }
                       }
                   }
                   else
                   {
                       if (Regex.IsMatch(key, this.Action + this.ActionRegex))
                       {
                           return !string.IsNullOrEmpty(req[key]);
                       }
                   }

               }
               return false;
           }
           else
           {
               return req.AllKeys.Contains(this.Action);
           }
       }
   }

कोड-गंध-कम बहु सबमिट बटन भविष्य का आनंद लें।

धन्यवाद


लिंक वर्तमान में टूटा हुआ है, यह मेरे द्वारा खोजा गया निकटतम निकटतम संस्करण है: web.archive.org/web/2011070626230408/http://blogs.sonatribe.com/…
इयान केम्प

हाय इयान - कि खुदाई के लिए धन्यवाद - मैंने इसे यहां पुनर्प्रकाशित किया है: iwayneo.blogspot.co.uk/2013/10/…

4

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

कक्षा में भाग लें

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class HttpParamActionAttribute : ActionNameSelectorAttribute
{
    private readonly string actionName;

    public HttpParamActionAttribute(string actionName)
    {
        this.actionName = actionName;
    }

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
            return true;

        if (!actionName.Equals(this.actionName, StringComparison.InvariantCultureIgnoreCase))
            return false;

        var request = controllerContext.RequestContext.HttpContext.Request;
        return request[methodInfo.Name] != null;
    }
}

नियंत्रक

[Authorize(Roles="CanAddContent")]
public ActionResult CreateContent(Guid contentOwnerId)
{
    var viewModel = new ContentViewModel
    {
        ContentOwnerId = contentOwnerId
        //populate rest of view model
    }
    return View("CreateContent", viewModel);
}

[Authorize(Roles="CanAddContent"), HttpPost, HttpParamAction("CreateContent"), ValidateAntiForgeryToken]
public ActionResult SaveDraft(ContentFormModel model)
{
    //Save as draft
    return RedirectToAction("CreateContent");
}

[Authorize(Roles="CanAddContent"), HttpPost, HttpParamAction("CreateContent"), ValidateAntiForgeryToken]
public ActionResult Publish(ContentFormModel model)
{
    //publish content
    return RedirectToAction("CreateContent");
}

राय

@using (Ajax.BeginForm("CreateContent", "MyController", new { contentOwnerId = Model.ContentOwnerId }))
{
    @Html.AntiForgeryToken()
    @Html.HiddenFor(x => x.ContentOwnerId)

    <!-- Rest of your form controls -->
    <input name="SaveDraft" type="submit" value="SaveDraft" />
    <input name="Publish" type="submit" value="Publish" />
}

3

एक्सटेंशन विधि का उपयोग करके मेरा JQuery का दृष्टिकोण:

public static MvcHtmlString SubmitButtonFor<TController>(this HtmlHelper helper, Expression<Action<TController>> action, string value) where TController : Controller
{
    RouteValueDictionary routingValues = Microsoft.Web.Mvc.Internal.ExpressionHelper.GetRouteValuesFromExpression(action);

    var onclick = string.Format("$('form').first().attr('action', '/{0}')", string.Join("/", routingValues.Values.ToArray().Where(x => x != null).Select(x => x.ToString()).ToArray()));
    var html = "<input type=\"submit\" value=\"" + value + "\" onclick=\"" + onclick + "\" />";

    return MvcHtmlString.Create(html);
}

आप इसे इस तरह से उपयोग कर सकते हैं:

@(Html.SubmitButtonFor<FooController>(c => c.Save(null), "Save"))

और यह इस तरह प्रस्तुत करता है:

<input type="submit" value="Save" onclick="$('form').first().attr('action', '/Foo/Save')" >

3

प्रत्येक सबमिट बटन के लिए बस जोड़ें:

$('#btnSelector').click(function () {

    $('form').attr('action', "/Your/Action/);
    $('form').submit();

});

3

Mzzicki उत्तर के आधार पर मैं थोड़ा अलग समाधान के साथ आता हूं। मैं अभी भी उपयोग करता ActionNameSelectorAttributeहूं लेकिन मुझे दो बटन 'सेव' और 'सिंक' को संभालने की जरूरत है। वे लगभग ऐसा ही करते हैं इसलिए मैं दो कार्रवाई नहीं करना चाहता था।

विशेषता :

public class MultipleButtonActionAttribute : ActionNameSelectorAttribute
{        
    private readonly List<string> AcceptedButtonNames;

    public MultipleButtonActionAttribute(params string[] acceptedButtonNames)
    {
        AcceptedButtonNames = acceptedButtonNames.ToList();
    }

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {            
        foreach (var acceptedButtonName in AcceptedButtonNames)
        {
            var button = controllerContext.Controller.ValueProvider.GetValue(acceptedButtonName);
            if (button == null)
            {
                continue;
            }                
            controllerContext.Controller.ControllerContext.RouteData.Values.Add("ButtonName", acceptedButtonName);
            return true;
        }
        return false;
    }
}

राय

<input type="submit" value="Save" name="Save" />
<input type="submit" value="Save and Sync" name="Sync" />

नियंत्रक

 [MultipleButtonAction("Save", "Sync")]
 public ActionResult Sync(OrgSynchronizationEditModel model)
 {
     var btn = this.RouteData.Values["ButtonName"];

मैं यह भी बताना चाहता हूं कि यदि कार्रवाई अलग-अलग चीजें करते हैं तो मैं शायद मोझिकी पोस्ट का पालन करूंगा।


1

मैंने HtmlHelper के लिए एक ActionButton विधि बनाई है । यह OnClick इवेंट में थोड़ी सी जावास्क्रिप्ट के साथ सामान्य इनपुट बटन उत्पन्न करेगा जो निर्दिष्ट नियंत्रक / कार्रवाई को फ़ॉर्म सबमिट करेगा।

आप उस तरह सहायक का उपयोग करें

@Html.ActionButton("MyControllerName", "MyActionName", "button text")

यह निम्न HTML उत्पन्न करेगा

<input type="button" value="button text" onclick="this.form.action = '/MyWebsiteFolder/MyControllerName/MyActionName'; this.form.submit();">

यहाँ विस्तार विधि कोड है:

VB.Net

<System.Runtime.CompilerServices.Extension()>
Function ActionButton(pHtml As HtmlHelper, pAction As String, pController As String, pRouteValues As Object, pBtnValue As String, pBtnName As String, pBtnID As String) As MvcHtmlString
    Dim urlHelperForActionLink As UrlHelper
    Dim btnTagBuilder As TagBuilder

    Dim actionLink As String
    Dim onClickEventJavascript As String

    urlHelperForActionLink = New UrlHelper(pHtml.ViewContext.RequestContext)
    If pController <> "" Then
        actionLink = urlHelperForActionLink.Action(pAction, pController, pRouteValues)
    Else
        actionLink = urlHelperForActionLink.Action(pAction, pRouteValues)
    End If
    onClickEventJavascript = "this.form.action = '" & actionLink & "'; this.form.submit();"

    btnTagBuilder = New TagBuilder("input")
    btnTagBuilder.MergeAttribute("type", "button")

    btnTagBuilder.MergeAttribute("onClick", onClickEventJavascript)

    If pBtnValue <> "" Then btnTagBuilder.MergeAttribute("value", pBtnValue)
    If pBtnName <> "" Then btnTagBuilder.MergeAttribute("name", pBtnName)
    If pBtnID <> "" Then btnTagBuilder.MergeAttribute("id", pBtnID)

    Return MvcHtmlString.Create(btnTagBuilder.ToString(TagRenderMode.Normal))
End Function

C # (C # कोड VB DLL से केवल विघटित है, इसलिए यह कुछ सौंदर्यीकरण प्राप्त कर सकता है ... लेकिन समय बहुत कम है :-))

public static MvcHtmlString ActionButton(this HtmlHelper pHtml, string pAction, string pController, object pRouteValues, string pBtnValue, string pBtnName, string pBtnID)
{
    UrlHelper urlHelperForActionLink = new UrlHelper(pHtml.ViewContext.RequestContext);
    bool flag = Operators.CompareString(pController, "", true) != 0;
    string actionLink;
    if (flag)
    {
        actionLink = urlHelperForActionLink.Action(pAction, pController, System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(pRouteValues));
    }
    else
    {
        actionLink = urlHelperForActionLink.Action(pAction, System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(pRouteValues));
    }
    string onClickEventJavascript = "this.form.action = '" + actionLink + "'; this.form.submit();";
    TagBuilder btnTagBuilder = new TagBuilder("input");
    btnTagBuilder.MergeAttribute("type", "button");
    btnTagBuilder.MergeAttribute("onClick", onClickEventJavascript);
    flag = (Operators.CompareString(pBtnValue, "", true) != 0);
    if (flag)
    {
        btnTagBuilder.MergeAttribute("value", pBtnValue);
    }
    flag = (Operators.CompareString(pBtnName, "", true) != 0);
    if (flag)
    {
        btnTagBuilder.MergeAttribute("name", pBtnName);
    }
    flag = (Operators.CompareString(pBtnID, "", true) != 0);
    if (flag)
    {
        btnTagBuilder.MergeAttribute("id", pBtnID);
    }
    return MvcHtmlString.Create(btnTagBuilder.ToString(TagRenderMode.Normal));
}

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.