আপনি কীভাবে এএসপি.নেট এমভিসি ফ্রেমওয়ার্কে একাধিক জমা বোতামগুলি পরিচালনা করবেন?


733

একই ফর্ম থেকে একাধিক জমা বোতাম হ্যান্ডেল করার কোন সহজ উপায় আছে? উদাহরণ স্বরূপ:

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

এএসপি.নেট ফ্রেমওয়ার্ক বিটাতে এটি কীভাবে করবেন কোনও ধারণা? আমি যে সমস্ত উদাহরণগুলি সংগ্রহ করেছি তার মধ্যে একক বোতাম রয়েছে।


6
এএসপি.নেট কোর থেকে শুরু করে উল্লেখযোগ্য এখানে এখানে তালিকাবদ্ধগুলির চেয়ে প্রায় সহজ সমাধান রয়েছে
স্টিভেন জিউরিস

এই টিউটোরিয়ালটি সহায়তা করতে পারে:
এএসপি.নেট এমভিসিতে

উত্তর:


629

এখানে একাধিক বেশির পরিষ্কার অ্যাট্রিবিউট ভিত্তিক সমাধান পোস্ট এবং মন্তব্য উপর খুব বেশী নির্ভর করে বোতাম সমস্যার জমা হয় মার্টেন 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
ব্যবহৃত অন্যান্য কৌশলগুলির সুখী বিবাহ হিসাবে আমি এই সমাধানটি পেয়েছি। পুরোপুরি কাজ করে এবং স্থানীয়করণকে প্রভাবিত করে না।
ট্রেভরেক

17
দুর্দান্ত সমাধান !! এই শীর্ষস্থানীয় উত্তরগুলির চেয়ে অনেক বেশি দরকারী
সাশা

11
এই পদ্ধতির সাথে একটি সমস্যা হ'ল যদি আপনি return View(viewmodel)আপনার মডেলটিতে ত্রুটি রয়েছে এমন ক্ষেত্রে চেষ্টা করে থাকেন তবে এটি Sendআপনার যুক্তির নাম কী হবে তার উপর নির্ভর করে ডাকা একটি দৃষ্টিভঙ্গি ফিরিয়ে দেওয়ার চেষ্টা করবে ।
জুতো

15
@ শো - সবে একটি অনুরূপ জিনিস খুঁজে পেয়েছেন। আপনি যদি এই পদ্ধতিটি ব্যবহার করে থাকেন তবে ফিরে আসার জন্য দৃশ্যের নামটি আপনি স্পষ্টভাবে উল্লেখ করেছেন তা নিশ্চিত করুন:return View("Index", viewModel)
আজবিওয়েন

4
কেবল একটি তথ্য, আমাদের সিস্টেম যুক্ত করতে হবে Meth মেথডেইনফো-এর জন্য নির্বাচন
সুব্রমনিয়ান

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
স্যুইচ / কেস কেবল ধ্রুবকদের সাথে কাজ করে, তাই স্থানীয়ীকৃত সংস্করণটি স্যুইচ / কেস ব্যবহার করতে পারে না। অন্যথায় বা অন্য কিছু প্রেরণ পদ্ধতিতে আপনাকে স্যুইচ করতে হবে।
mlibby

10
আপনার <ইনপুট টাইপের পরিবর্তে <বোতাম টাইপ = "জমা" ব্যবহার করা উচিত, কারণ <বোতাম টাইপের মান পাঠ্য নয়;)। তারপরে আপনার এর মতো কিছু থাকতে পারে: <বোতামের নাম = "মাই সাবমিট বাটন" টাইপ = "জমা" মান = "কীভ্যালু"> আপনার বাটনটেক্সট </ বাটন>
জে

4
মডেলটি কেবল জমা দেওয়ার পরিবর্তে অ্যাকশনে পাস করার সাথে এটি কীভাবে কাজ করবে?
bizzehdee

2
আপনি যদি jQuery ব্যবহার করছেন তবে আপনার বোতামগুলির নাম "অ্যাকশন" না দেওয়ার বিষয়ে সতর্ক হন। এটি লাইব্রেরির মধ্যে দ্বন্দ্ব সৃষ্টি করে যা ক্রিয়াকলাপের URL ভঙ্গ করে।
হটএন

121

উল্লিখিত হিসাবে আপনি ক্রিয়ায় নামটি যাচাই করতে পারেন, তবে আপনি এটি বিবেচনা করতে পারেন এটি ভাল নকশা কিনা। ক্রিয়াকলাপের দায়িত্ব বিবেচনা করা এবং বোতামের নামের মতো ইউআই দিকগুলি এই নকশাকে খুব বেশি সংযুক্ত না করা ভাল idea সুতরাং 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(); %>

এছাড়াও, "বাতিল" এর ক্ষেত্রে, আপনি সাধারণত ফর্মটি প্রক্রিয়া করছেন না এবং একটি নতুন ইউআরএল যাচ্ছেন। এই ক্ষেত্রে আপনাকে ফর্মটি জমা দেওয়ার দরকার নেই এবং কেবল একটি লিঙ্কের প্রয়োজন:

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

53
প্রতিটি ঠিকঠাক বোতামের জন্য যখন আপনার একই ফর্ম ডেটা দরকার না তখন এটি ঠিক আছে। আপনার যদি ডিলান বিটিয়ের চেয়ে সাধারণ ফর্মের সমস্ত ডেটা প্রয়োজন হয় তবেই যাওয়ার উপায়। এটি করার জন্য আর কোনও মার্জিত উপায় নেই?
জিদান

3
ভিজ্যুয়াল উপস্থাপনা সম্পর্কে, এই ক্ষেত্রে কীভাবে "বাতিল" বোতামের পাশে "প্রেরণ" বাটন থাকবে?
ক্রিস- I

1
ডিলান: ভাল একটি বাতিল বোতামের জন্য আপনাকে কোনও তথ্য জমা দেওয়ার দরকার নেই এবং নিয়ামকটিকে ইউআই উপাদানগুলির সাথে জুড়ি দেওয়া খারাপ অভ্যাস। তবে আপনি যদি কম বেশি জেনেরিক "কমান্ড" তৈরি করতে পারেন তবে আমার মনে হয় এটি ঠিক আছে, তবে আমি এটি "সাবমিট বাটন" এর সাথে বেঁধে রাখব না কারণ এটি কোনও ইউআই উপাদানটির নাম।
ট্রেভর ডি কোয়েকোয়েক

1
@ ক্রিস: আপনি নিজের বোতামগুলি সিএসএসের সাথে রাখতে পারেন এবং তারা এখনও 2 টি ভিন্ন ফর্ম বিভাগে থাকতে পারেন।
ট্রেভর ডি কোয়েকোয়েক

8
গম্ভীরভাবে? এটা কি আমার ছাড়া কারও কাছে গন্ধ পাচ্ছে না ?!

98

আইলন পরামর্শ দেয় আপনি এটি এর মতো করতে পারেন:

আপনার যদি একাধিক বোতাম থাকে তবে প্রতিটি বোতামকে একটি নাম দিয়ে আপনি তাদের মধ্যে পার্থক্য করতে পারেন:

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

আপনার নিয়ামক অ্যাকশন পদ্ধতিতে আপনি এইচটিএমএল ইনপুট ট্যাগের নাম অনুসারে প্যারামিটার যুক্ত করতে পারেন:

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
যদি কেউ এই পুরানো প্রশ্নটি দেখা দেয় তবে আপনি এইচটিএমএল 5 <বাটন> উপাদান ব্যবহার করতে না চাইলে এটিই সবচেয়ে পরিষ্কার উত্তর। যদি আপনি এইচটিএমএল 5 মনে করেন না তবে মান অ্যাট্রিবিউট সহ <বাটন> ব্যবহার করুন।
কুগেল

এই ফর্মটিতে একটি অজ্যাক্স কল তৈরি করলে আপনি এটি কীভাবে করবেন। দেখে মনে হচ্ছে form.serialize () বোতামের নাম জমা দেওয়ার উপায় গ্রহণ করে না ..
এমকো

@ কুগেল ঠিক বলেছেন, এটি এখনও সবচেয়ে পরিষ্কার উত্তর। ধন্যবাদ
আরিফ YILMAZ

45

এ সম্পর্কে সবেমাত্র একটি পোস্ট লিখেছেন: এএসপি.নেট এমভিসির সাথে একাধিক জমা বোতাম :

মূলত, ব্যবহারের পরিবর্তে ActionMethodSelectorAttribute, আমি ব্যবহার করছি ActionNameSelectorAttribute, যা আমাকে ক্রিয়াকলাপের নামটি ভান করতে দেয় যা আমি তা হতে চাই। ভাগ্যক্রমে, ActionNameSelectorAttributeআমাকে কেবল ক্রিয়া নাম নির্দিষ্ট করে না, পরিবর্তে আমি বর্তমান ক্রিয়া অনুরোধের সাথে মেলে কিনা তা চয়ন করতে পারি।

সুতরাং আমার ক্লাস আছে (বিটিডব্লিউ আমি নামের খুব পছন্দ করি না):

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(…) {
        //…
    } 
}

আপনি যেমন দেখেন, বৈশিষ্ট্যটির জন্য আপনাকে কোনও কিছুই নির্দিষ্ট করার প্রয়োজন হয় না। এছাড়াও, বোতামগুলির নামটি সরাসরি পদ্ধতিতে অনুবাদ করা হয় translated অতিরিক্তভাবে (আমি এটি চেষ্টা করি নি) এগুলিও সাধারণ ক্রিয়া হিসাবে কাজ করা উচিত, যাতে আপনি তাদের যে কোনওটিতে সরাসরি পোস্ট করতে পারেন।


1
সুন্দর! আমি মনে করি এটি সবচেয়ে মার্জিত সমাধান। এটা তোলে ঘটিয়েছে মান এর submitবিবেচনা থেকে ট্যাগ, যা আদর্শ যেহেতু এটি একটি বিশুদ্ধ-ui গুণ যা কন্ট্রোল- প্রবাহ কোন জন্মদান থাকা উচিত নয়। পরিবর্তে, nameপ্রতিটি submitট্যাগের অনন্য বৈশিষ্ট্যটি আপনার নিয়ামকের একটি পৃথক পদক্ষেপে সরাসরি অনুবাদ করে।
কার্ক ওল

আমার জন্য +1, এটি এখন পর্যন্ত এই সমস্যার সর্বোত্তম সমাধান। যেহেতু আমি এটি বাস্তবায়ন করেছি, আমি লক্ষ্য করেছি যে প্রচুর ট্র্যাফিক এইচটিপিপিআরামঅ্যাকশনআত্রিবুত পেরিয়ে গেছে তবে একটি অনুরোধ প্রক্রিয়াকরণের সময় অ্যাস্প নেট নেট এমভিসি-র অন্যান্য সমস্ত কাজের তুলনায় এটি সম্পূর্ণ গ্রহণযোগ্য। আমাকে কেবল হ্যাক করার জন্যই আমার নিয়ামকটিতে একটি খালি 'অ্যাকশন' রাখা হয়েছে যাতে রেশার্পার আমাকে সতর্ক করে দিয়েছিলেন যে 'ক্রিয়া' অ্যাকশনটির অস্তিত্ব নেই। আপনাকে অনেক ধন্যবাদ!
স্যামুয়েল

আমি সমস্ত সমাধানগুলি পর্যালোচনা করেছি এবং এটিও একটি চমৎকার মার্জিত, সহজ সমাধান agree দুর্দান্ত বিসি তে কোনও শর্তযুক্ত বিবৃতি এবং শক্তসমর্থ নেই যেখানে আপনি একটি নতুন বোতাম থাকাকালীন একটি নতুন নিয়ামক ক্রিয়াকে সংজ্ঞায়িত করতে পারবেন। আমার ক্লাসটি মাল্টিবটন অ্যাকশনহ্যান্ডলার এফওয়াইআইআই ;-)
বলেছে

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

শীর্ষ উত্তর চেয়ে অনেক সহজ! ধন্যবাদ!
pabben

35

আমি পরামর্শ দিচ্ছি আগ্রহী পক্ষগুলি মার্টেন বালিয়াউয়ের সমাধানটি দেখুন । আমি মনে করি এটি খুব মার্জিত।

লিঙ্কটি বিলুপ্ত হয়ে গেলে, MultiButtonকোনও ক্রিয়াকলাপের সাথে সম্পর্কিত হওয়া উচিত বাটনটি ক্লিক করুন তা নির্দেশ করতে এটি একটি নিয়ামক ক্রিয়ায় প্রয়োগ করা বৈশিষ্ট্যটি ব্যবহার করছে ।


আমরা এখন এটির সমাধানটি ব্যবহার করছি এবং এটি খুব ঝরঝরে। এটি এমভিসি 2 কেবলমাত্র কি?
সাইমন

এটা সুন্দর! আমি এই আগে দেখতে না! আমি সম্মত হয়েছি যে আপনি কেবলমাত্র একটি বোতাম ব্যবহার করতে একাধিক সাবমিট ব্যবহার করছেন এমন কোনও সমাধান পুনরায় ডিজাইন করতে চাইতে পারেন, আমি এমন এক জায়গায় রয়েছি যেখানে আমি হ্যামস্ট্রং করছি এবং এটি অবশ্যই করতে হবে। এই উত্তরটি জিততে হবে!
রিকন

এটি একটি দুর্দান্ত সমাধান। খুব পরিষ্কার
Arnej65

এই পদ্ধতির চেষ্টা করেও এটি এমভিসি 3 এ কাজ করতে সক্ষম হয় নি। আমার পক্ষে # 1 ভোট প্রাপ্তির একটি ভিন্নতা কাজ করেছিল।
স্কট লরেন্স

সংক্ষিপ্ত এবং মিষ্টি .. তবে এমভিসি 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

অ্যাকশনসিলিটনাম সম্পর্কে আমি কিছু পছন্দ করি না তা হ'ল ইসভালিডনামকে নিয়ন্ত্রকের প্রতিটি ক্রিয়া পদ্ধতির জন্য ডাকা হয়; আমি জানি না কেন এটি এভাবে কাজ করে। আমি এমন একটি সমাধান পছন্দ করি যেখানে প্রতিটি বোতামের এটির ভিত্তিতে আলাদা আলাদা নাম থাকে তবে ফর্মের বোতামগুলির মতো অ্যাকশন পদ্ধতিতে আপনার যতগুলি পরামিতি থাকতে হবে তা আমি পছন্দ করি না। আমি সমস্ত বোতামের ধরণের জন্য একটি এনাম তৈরি করেছি:

public enum ButtonType
{
    Submit,
    Cancel,
    Delete
}

অ্যাকশনসিলিটনামের পরিবর্তে, আমি একটি অ্যাকশন ফিল্টার ব্যবহার করি:

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();
}

আমি নিয়ামক পদ্ধতিতে অনডিলিট এবং অনসাইভের নাল মান পাই। তুমি কি জানো কেন?
দিগন্ত কুমার

আপনি যদি সেই অনুযায়ী বোতামটি ক্লিক করেন তবে কোনও একটি নাল হবে না। আপনি কোন বোতামটি নাল পেয়ে ক্লিক করেন?
সের্গেই

11

আমি এই 'সমস্যা' জুড়ে এসেছি কিন্তু nameগুণটি যুক্ত করে একটি যুক্তিসঙ্গত সমাধান পেয়েছি । আমি অন্যান্য ভাষায় এই সমস্যাটি মনে করতে পারি না।

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

  • ...
  • যদি কোনও ফর্মটিতে একাধিক জমা বোতাম থাকে তবে কেবল সক্রিয় জমা দেওয়া বোতামটি সফল।
  • ...

অর্থ নীচের কোড valueবৈশিষ্ট্যগুলি অতিরিক্ত কোড পরীক্ষা করার জন্য দৃ strongly়ভাবে টাইপ করা রিসোর্স ফাইল বা ধ্রুবকের প্রয়োজন ছাড়াই স্থানীয়করণ, আন্তর্জাতিককরণ হতে পারে ।

<% 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

    }

}

এটি এমন একটি সমাধান যা আমরা একটি সাধারণ ওয়েব অ্যাপের জন্য ব্যবহার করতে বেছে নিয়েছি যেখানে আমরা এএসপি.এনইটি ওয়েব ফর্মের কার্যকারিতা চেয়েছিলাম তবে এমভিসির মধ্যেই।
ব্র্যান্ডনজি

10

এইচটিএমএল 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") />

}

নীচে আমার উত্তরটি একবার দেখুন, এটি খসড়া নির্দিষ্টকরণের উপর নির্ভর করে না। আপনার উত্তরটি সম্ভাবনাটিকে বিভিন্ন ক্রিয়াকলাপ url করতে দেয়, যা আমার নয় mine
টম হফম্যান

9

তিনটি উপায় রয়েছে যার মাধ্যমে আপনি উপরের সমস্যাটি সমাধান করতে পারেন

  1. এইচটিএমএল উপায়
  2. Jquery উপায়
  3. "অ্যাকশননেমসিলিটরঅ্যাট্রিবিউট" উপায়ে

নীচে এমন একটি ভিডিও রয়েছে যা তিনটি পদ্ধতিরই একটি প্রদর্শক উপায়ে সংক্ষিপ্তসার করে।

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

এইচটিএমএল উপায়: -

এইচটিএমএল উপায়ে আমাদের দুটি ফর্ম তৈরি করতে হবে এবং প্রতিটি ফর্মের মধ্যে "জমা দিন" বোতামটি স্থাপন করতে হবে। এবং প্রতিটি ফর্মের ক্রিয়াটি বিভিন্ন / সম্পর্কিত ক্রিয়াকে নির্দেশ করবে। আপনি নীচের কোডটি দেখতে পাচ্ছেন যে প্রথম ফর্মটি "অ্যাকশন 1" তে পোস্ট করছে এবং দ্বিতীয় ফর্মটি "অ্যাকশন 2" এ পোস্ট করবে যার উপর নির্ভর করে "জমা দিন" বোতামটি ক্লিক করা হয়েছে।

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

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

আজাক্স উপায়: -

আপনি যদি একজন আজাক্স প্রেমিক হন তবে এই দ্বিতীয় বিকল্পটি আপনাকে আরও উত্তেজিত করবে। আজাক্স উপায়ে আমরা দুটি আলাদা ফাংশন "ফান 1" এবং "ফান 1" তৈরি করতে পারি, নীচের কোডটি দেখুন। এই ফাংশনগুলি জ্যাকুয়ারি বা অন্য কোনও ফ্রেমওয়ার্ক ব্যবহার করে আজাক্স কল করবে। এই ফাংশনগুলির প্রতিটি "জমা দিন" বোতামটির "অনক্লিক" ইভেন্টের সাথে আবদ্ধ হয়। এই ফাংশনগুলির প্রত্যেকটি নিজ নিজ ক্রিয়াকলাপের নামে কল করে।

<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>

"অ্যাকশননেমসিলিটরঅ্যাট্রিবিউট" ব্যবহার করে: -

এটি একটি দুর্দান্ত এবং একটি পরিষ্কার বিকল্প। "অ্যাকশননেমসিলিটরঅ্যাট্রিবিউট" একটি সাধারণ অ্যাট্রিবিউট শ্রেণি যেখানে আমরা সিদ্ধান্ত গ্রহণের যুক্তি লিখতে পারি যা কোন ক্রিয়াটি কার্যকর করা যায় তা সিদ্ধান্ত নেবে।

তাই প্রথম জিনিসটি এইচটিএমএল-তে রয়েছে সার্ভারে শনাক্ত করার জন্য আমাদের জমা দেওয়া বোতামগুলিতে সঠিক নাম রাখতে হবে to

আপনি দেখতে পাবেন যে আমরা বোতামের নামগুলিতে "সংরক্ষণ" এবং "মুছুন" রেখেছি। এছাড়াও আপনি যে ক্রিয়াটি সুনির্দিষ্ট করতে পারেন তার জন্য আমরা কেবল কন্ট্রোলারের নাম রেখেছি "গ্রাহক" এবং কোনও নির্দিষ্ট ক্রিয়াকলাপ নয়। আমরা আশা করি অ্যাকশন নামটি "অ্যাকশননামসিলিটরঅ্যাট্রিবিউট" দ্বারা সিদ্ধান্ত নেওয়া হবে।

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

সুতরাং যখন জমা দেওয়ার বোতামটি ক্লিক করা হয়, এটি প্রথমে "অ্যাকশননেসলেক্টর" বৈশিষ্ট্যটিকে হিট করে এবং তারপরে কোন জমাটি বরখাস্ত করা হয় তার উপর নির্ভর করে এটি যথাযথ ক্রিয়াটির জন্য প্রার্থনা করে।

এখানে চিত্র বর্ণনা লিখুন

সুতরাং প্রথম পদক্ষেপটি এমন একটি শ্রেণি তৈরি করা যা "ক্রিয়াকলাপ নাম থেকে নির্বাচন করে" শ্রেণি থেকে উত্তরাধিকার সূত্রে আসে। এই শ্রেণিতে আমরা একটি সাধারণ সম্পত্তি "নাম" তৈরি করেছি।

আমাদের "ইসভালিডনাম" ফাংশনটি ওভাররাইড করা দরকার যা সত্য বা ফ্লাস দেয়। এই ক্রিয়াটি যেখানে আমরা যুক্তিটি লিখি সেখানে কোনও ক্রিয়াকলাপ কার্যকর করতে হবে কি না। সুতরাং যদি এই ফাংশনটি সত্য ফিরে আসে তবে ক্রিয়াটি কার্যকর করা হয় অন্যথায় এটি হয় না।

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;

        }
    }

উপরের ফাংশনটির প্রধান হৃদয় নীচের কোডে রয়েছে। ফর্ম থেকে পোস্ট করা সমস্ত ডেটা "মানপ্রভাইডার" সংগ্রহে রয়েছে। সুতরাং এটি প্রথমে "নাম" মানটি সন্ধান করে এবং যদি এটি HTTP অনুরোধে পাওয়া যায় তবে এটি সত্য ফিরে আসে বা অন্যথায় এটি মিথ্যা প্রত্যাবর্তন করে।

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

এই বৈশিষ্ট্য শ্রেণিটি তখন সংশ্লিষ্ট ক্রিয়াতে সজ্জিত হতে পারে এবং সম্পর্কিত "নাম" মান সরবরাহ করা যেতে পারে। সুতরাং যদি জমাটি এই ক্রিয়াকে আঘাত করে এবং যদি এইচটিএমএল জমা বোতামটির নামের সাথে মিলে যায় তবে ক্রিয়াটি আরও চালিত করা হয় অন্যথায় এটি তা করে না।

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

ডেভিড ফাইন্ডলি তার এএসপি. নেট ওয়েবলগে এই কাজ করার জন্য আপনার কাছে প্রায় 3 টি বিভিন্ন বিকল্প লেখেন।

তার সমাধানগুলি এবং তার প্রতিটিটির সুবিধাগুলি এবং অসুবিধাগুলি দেখতে একই ফর্মটিতে নিবন্ধটি একাধিক বোতামটি পড়ুন । আইএমএইচও তিনি একটি খুব মার্জিত সমাধান সরবরাহ করেন যা আপনার ক্রিয়াটি সজ্জিত করে এমন বৈশিষ্ট্যগুলির ব্যবহার করে।


7

এটি সেই কৌশলটি আমি ব্যবহার করেছি এবং আমি এখনও এটি এখানে দেখতে পাচ্ছি না। এই লিঙ্কটি (সাজিদ ইসমাইল পোস্ট করেছেন) যা এই সমাধানটি অনুপ্রাণিত করে তা হ'ল http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-m Multipleple-buttons-in-the-same-for .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;
         }
    }
}

দেখে মনে হচ্ছে যে সমাধানটি ইরোননেট সরবরাহ করেছে।
ক্রিস ভ্যান ডের মাস্ট

অবশ্যই অনুরূপ, তবে এটি স্থানীয়করণ এবং নিয়ামক কোড উভয়ই দেখায় যা এটি এই থ্রেডে আমি এভাবে দেখিনি। কীভাবে এটি করবেন তা সন্ধান করতে গিয়ে আমি এই থ্রেডটি পেয়েছি এবং একই নৌকায় যে কেউ থাকতে পারে তার জন্য আমি কী নিয়ে এসেছি তা নথিভুক্ত করতে চেয়েছিলাম।
mlibby

1
আসলে, এটি এরও বাইরে আইরনিকনেটের মতো নয়। তিনি <input>উপাদান ব্যবহার করেন । আমি ব্যবহার করি <button>, যা ভেরিয়েবল মান বৈশিষ্ট্য ছাড়াই স্থানীয়করণের প্রয়োজন।
mlibby

7

এই স্ক্রিপ্টটি কোনও ডেটা-ফর্ম-অ্যাকশন বৈশিষ্ট্য নির্দিষ্ট করতে দেয় যা সমস্ত ব্রাউজারে (আপত্তিহীনভাবে) এইচটিএমএল 5 ফর্মেশন বৈশিষ্ট্য হিসাবে কাজ করবে:

$(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);             
});

বোতামটি ধারণ করে ফর্মটি ডেটা-ফর্ম-অ্যাকশন বৈশিষ্ট্যে নির্দিষ্ট ইউআরএলে পোস্ট করা হবে:

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

এর জন্য jQuery 1.7 প্রয়োজন। পূর্ববর্তী সংস্করণগুলির জন্য আপনার live()পরিবর্তে ব্যবহার করা উচিত on()


6

একাধিক চিত্র এবং / অথবা পাঠ্য বোতামগুলি হ্যান্ডেল করতে আমি এখানে লিখেছি একটি এক্সটেনশন পদ্ধতি।

এখানে একটি চিত্র বোতামের জন্য এইচটিএমএল রয়েছে:

<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

আমার কাছে সঠিক জায়গায় মন্তব্য করার মতো পর্যাপ্ত প্রতিনিধি নেই, তবে আমি সারা দিন এইভাবে ব্যয় করেছি তাই ভাগ করে নিতে চাই।

"মাল্টিপল বাটনঅ্যাট্রিবিউট" সমাধানটি কার্যকর করার চেষ্টা করার সময় ValueProvider.GetValue(keyValue)ভুলভাবে ফিরে আসবে null

দেখা গেল যে আমি সিস্টেমটি উল্লেখ করছি W ওয়েব.এমভিসি সংস্করণ 3.0.০ যখন এটি হওয়া উচিত ছিল (.০ (অন্যান্য সমাবেশগুলি lies.০)। আমি জানি না কেন আমার প্রকল্পটি সঠিকভাবে আপগ্রেড হয়নি এবং আমার অন্য কোনও স্পষ্ট সমস্যা ছিল না।

সুতরাং যদি আপনার ActionNameSelectorAttributeকাজ না হয় ... এটি পরীক্ষা করে দেখুন।


6

আমি পার্টিতে বেশ দেরি করেছি, তবে এখানেই চলেছে ... আমার বাস্তবায়ন @ এমকোজিকির কাছ থেকে ধার করেছে তবে ভুল হওয়ার জন্য কম হার্ডকোডযুক্ত স্ট্রিং দরকার requires ফ্রেমওয়ার্ক 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

এই সমাধানের উদ্দেশ্য এমভিসি পোস্ট রাউটিংয়ের প্রায় কাজ। একটি উন্নতি বর্ণনা করুন।
অ্যারন হুডন

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

আমি সমস্ত সমাধানগুলির সংশ্লেষণ করার চেষ্টা করেছি এবং একটি [বাটনহ্যান্ডলার] বৈশিষ্ট্য তৈরি করেছি যা কোনও ফর্মের একাধিক বোতাম হ্যান্ডেল করা সহজ করে।

আমি এএসপি.নেট এমভিসিতে কোডপ্রজেক্ট একাধিক প্যারামিটারাইজড (স্থানীয়করণযোগ্য) ফর্ম বোতামে এটি বর্ণনা করেছি ।

এই বোতামটির সাধারণ কেসটি পরিচালনা করতে:

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

নিম্নলিখিত ক্রিয়া পদ্ধতির মতো আপনার কিছু থাকবে:

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

কীভাবে বোতামটির নামটি অ্যাকশন পদ্ধতির নামের সাথে মেলে Notice নিবন্ধে মানগুলির সাথে বোতাম এবং সূচকগুলির সাথে বোতাম কীভাবে রাখবেন তাও বর্ণনা করা হয়েছে।


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
এছাড়াও, আপনি এমন উত্তর পোস্ট করেছেন বলে মনে হচ্ছে যে কোনও কোড সহ কেবল কোড রয়েছে। কোডটি কেন কাজ করে তা ব্যাখ্যা করার জন্য আপনি কিছু আখ্যান যোগ করার বিষয়টি বিবেচনা করবেন এবং এটি কীসের প্রশ্নের উত্তর দেয়? এই প্রশ্নটি জিজ্ঞাসা করা ব্যক্তির পক্ষে এবং অন্য যে কেউ উপস্থিত হয়েছে এটি খুব সহায়ক হবে be
অ্যান্ড্রু বারবার

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);
           }
       }
   }

ভবিষ্যতে একটি কোড-গন্ধ-কম মাল্টি সাবমিট বোতামটি উপভোগ করুন।

ধন্যবাদ


লিঙ্কটি বর্তমানে ভাঙ্গা, এটি আমি খুঁজে পেতে পারি এমন নিকটতম সংরক্ষণাগারযুক্ত সংস্করণ: ওয়েব.আরচিভ.আর.ইউবি
ইয়ান কেম্প

হাই ইয়ান - এটি খননের জন্য ধন্যবাদ - আমি এটি এখানে পুনরায় পোস্ট করেছি: 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

একটি এক্সটেনশন পদ্ধতি ব্যবহার করে আমার জিক্যুয়ের পদ্ধতি:

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

মেকোজিকি উত্তরের ভিত্তিতে আমি কিছুটা আলাদা সমাধান নিয়ে আসছি। আমি এখনও ব্যবহার করি 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

আমি একজন তৈরি করেছি ActionButton জন্য পদ্ধতি HtmlHelper । এটা তোলে একটি বিট সাথে স্বাভাবিক ইনপুট বোতাম উত্পন্ন করবে জাভাস্ক্রিপ্ট মধ্যে 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

সি # (সি # কোডটি সবেমাত্র ভিবি ডিএলএল থেকে বিচ্ছিন্ন হয়েছে, যাতে এটি কিছুটা সুন্দরীকরণ পেতে পারে ... তবে সময়টি এতটাই স্বল্প :-))

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));
}

এই পদ্ধতিগুলির বিভিন্ন পরামিতি রয়েছে তবে ব্যবহারের স্বাচ্ছন্দ্যের জন্য আপনি কিছু ওভারলোড তৈরি করতে পারেন যা আপনার প্রয়োজনীয় প্যারামিটারগুলি নিতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.