এমভিসি যা জমা দেওয়ার বোতাম টিপানো হয়েছে


127

আমার এমভিসি ফর্মটিতে আমার দুটি বোতাম রয়েছে:

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

আমার কন্ট্রোলার অ্যাকশন থেকে আমি কীভাবে জানব যে কোনটি টিপানো হয়েছে?


তাদের নিজস্ব এজেএক্স কল যা তাদের উপযুক্ত পদ্ধতিতে যাবে কেবল এই বোতামগুলিতে অনক্লিক ইভেন্টগুলি যুক্ত করবেন না কেন? অর্থাৎ, <input name="submit" type="submit" id="submit" value="Save" onclick="saveMethod" />?
রাজারি

উত্তর:


168

আপনার জমা দেওয়া বোতাম উভয়ের নাম দিন

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

তারপরে আপনার নিয়ামকটিতে জমা দেওয়ার মানটি পান। ক্লিক করা বাটন কেবল তার মানটি পাস করবে।

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

আপনি অবশ্যই একটি মান স্যুইচ ব্লক দিয়ে বিভিন্ন ক্রিয়াকলাপ সম্পাদন করতে সেই মানটি মূল্যায়ন করতে পারেন।

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

    return View();
}

13
স্থানীয়করণ এই সমস্যার সমাধান করতে পারে এমন বিষয়ে সাবধান থাকুন, যার কাছে দারিনের সমাধানটি গ্রহণযোগ্য নয়।
রিচার্ড জাযালে

একই নামের দুটি ইনপুট ফলাফলের ফলে প্রতিটি অ্যারের জন্য একটি উপাদান দিয়ে অ্যারে পোস্ট করা হবে, যা কোনও একক মান হিসাবে বর্ণিত নয়। সুতরাং আমি আশা করি যেহেতু আমি এটি ব্যবহার করার আশা / চেষ্টা করছিলাম তাই অন্যথায় বলতে পারব, তবে এটি কার্যকর হয় না।
ক্রিস্টোফার কিং

1
@ রিচার্ডস্যাযেলা - আপনি কেবল আই 18 এন <button type="submit" name="action" value="draft"> Internationalized Save Text </button>উদ্দেশ্যে ব্যবহার করতে পারেননি , সুতরাং স্ট্রিংয়ের মুখোমুখি ব্যবহারকারীটি অনুকূলিতকরণযোগ্য এবং ফর্ম উপাদানগুলির নামগুলি কখনই ব্যবহারকারীর কাছে সরাসরি প্রকাশিত হয় না (যা এবং এর মধ্যে বিজোড়)
কাইলমিট

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

এবং আপনার নিয়ামক ক্রিয়ায়:

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

1
আমি কল্পনা করেছি যে কেবলমাত্র পরামিতি তালিকায় এটি যুক্ত করে এবং এটি সঠিকভাবে নামকরণ করে আরও বোতাম যুক্ত করা যেতে পারে। চমৎকার সমাধান!
GONALE

35

এটি একটি ভাল উত্তর, যাতে আমাদের কাছে একটি বোতামের জন্য পাঠ্য এবং মান উভয়ই থাকতে পারে:

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

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

এবং নিয়ামক:

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

সংক্ষেপে এটি একটি সাবমিট বাটন তবে আপনি নামটি বৈশিষ্ট্যটি ব্যবহার করে নামটি চয়ন করেন, এটি আরও বেশি শক্তিশালী কারণ আপনি নিয়ামক পদ্ধতির পরামিতিগুলিতে নাম জমা দেওয়ার বা বোতামের প্রতি বাধ্য নন, আপনি এটি নিজের পছন্দ মতো কল করতে পারেন ...


ধন্যবাদ স্যার, আমার যা প্রয়োজন তা
হ'ল

আপনার যদি একটি বহুভাষিক সিস্টেম থাকে যা ভাষা অনুযায়ী বোতামের মান পরিবর্তন করে।
ডেভ টেপসন

ডেভ - আমি মনে করি না যে কেউ এর মতো একটি সিস্টেম কোড করবে। এটি আপনার নিয়ামকের নাম বা ফাংশনের নাম স্থানীয়করণের মতো। বোতামটির মান কেবল সার্ভারের পার্শ্ব ব্যবহারের জন্য - এটি কোথাও প্রদর্শিত হয় না এবং স্থানীয়করণের প্রয়োজন হয় না।
নিক

20

নীচের মতো নাম ট্যাগ থেকে আপনি নিজের বোতামটি সনাক্ত করতে পারেন, আপনার নিজের নিয়ন্ত্রকের মধ্যে এই জাতীয় চেক করা দরকার

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

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

এই দৃশ্যে ইউনিট পরীক্ষায় অনুরোধ ক্লাসকে বিদ্রূপ করা আরও জটিল হতে পারে।
মুফ্লিক্স

6

একটি কাস্টম মাল্টিবুটনঅ্যাট্রিবিউট ব্যবহার করে নির্দেশনাগুলি অনুসরণ করা সত্যিই সহজ সহকারে এটি করার একটি দুর্দান্ত এবং সহজ উপায়:

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

সংক্ষিপ্তসার হিসাবে, আপনার জমা বোতামগুলিকে এই জাতীয় করুন:

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

আপনার ক্রিয়াগুলি এর মতো:

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

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

এবং এই ক্লাসটি তৈরি করুন:

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

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

1
একটি রেফারেন্সড লিঙ্কের সংক্ষিপ্ত বিবরণ সর্বদা সেরা (যেদিনের জন্য ব্লগটি বিলুপ্ত হবে)। সংক্ষেপে যে ব্লগ MultiButtonAttributeজমা দেওয়ার বোতামগুলির মধ্যে পার্থক্য করার অনুমতি দিতে একটি কাস্টম বৈশিষ্ট্যযুক্তকে সমর্থন করে । আসলে বেশ সুন্দর ধারণা।
কোডিং হয়ে গেছে

1
যদি Arnis L.একই পরামর্শ অনুসরণ করে, আপনি লক্ষ্য করে হতে পারে যে, তিনি 4 বছর আগে সঠিক একই লিংক প্রদান করা:>
গন কোডিং

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

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

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

} // End of the index method

এটি পোস্ট করা সমস্ত কিছুর একটি উচ্চতর সমাধান কারণ এটি প্রতিটি জটিল ক্রিয়াকলাপকৃত প্যারামিটার সেট ছাড়াই খুব জটিল ফর্ম ডেটা ধারাবাহিকভাবে পাস করার অনুমতি দেয়, যাতে নিয়ন্ত্রক যুক্তিকে জটিল ফর্মগুলির জন্য অত্যন্ত কাস্টমাইজ করতে সক্ষম করে। কুডোস ফ্রেডরিক :) আমি ধরে নিই যে এই ফর্ম সংগ্রহটি একাধিক রূপে পাস করবে?
স্টোকলি

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

3

এটিকে আরও সহজ করার জন্য আমি বলব যে আপনি আপনার বোতামগুলি নিম্নলিখিতটিতে পরিবর্তন করতে পারেন:

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

আপনার নিয়ামক:

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

2

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

এখানে আমার সমাধান, তাদের আলাদা আলাদা নাম দিন:

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

এবং আপনাকে নীচের মত ক্রিয়ায় যুক্তি হিসাবে বোতামের নাম উল্লেখ করতে হবে:

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

যখন ব্যবহারকারী একটি বাটন ব্যবহার করে পৃষ্ঠা জমা দেয়, কেবলমাত্র একটি আর্গুমেন্টেরই মান থাকবে। আমার ধারণা এটি অন্যদের জন্য সহায়ক হবে।

হালনাগাদ

এই উত্তরটি বেশ পুরানো এবং আমি আমার মতামতটি পুনর্বিবেচনা করি। মডেলের বৈশিষ্ট্যগুলিতে প্যারামিটারটি পাস করে এমন পরিস্থিতিতে পরিস্থিতিগুলির জন্য উপরের সমাধানটি ভাল। নিজেকে বিরক্ত করবেন না এবং আপনার প্রকল্পের জন্য সর্বোত্তম সমাধান নিন।


কিছু গঠনমূলক সমালোচনা: এটি আপনার পোস্ট হিসাবে বিদ্যমান উত্তরগুলি সহ এটি ভালভাবে কভার করা হয়েছে। অতিরিক্তভাবে, এটি ভাল স্কেল করে না। এইচটিএমএল কেবল সেই input[type=submit]মানটি পোস্ট করবে যা ট্রিগার হয়েছিল, সুতরাং তারা সমস্ত মডেল একই name(প্রাক্তন action) দিয়ে কোনও সম্পত্তিতে আবদ্ধ হতে পারে এবং তারপরে আপনি valueআপনার স্বাক্ষরটিতে যে বহু ভেরিয়েবলগুলি প্রবর্তন না করে সেই স্ট্রিংয়ের উপর ভিত্তি করে বোতামগুলি পৃথক করতে পারেন can । পোস্ট করার আগে ফর্ম্যাটিং / ইনডেন্টেশন সম্পর্কে চিন্তা করতে দয়া করে কিছুটা সময় নিন।
কাইলমিট

0

আপনি কী অনুরোধ.ফর্ম সংগ্রহ ব্যবহার করে খুঁজে পাচ্ছেন না? যদি প্রক্রিয়াটি ক্লিক করা হয় তবে অনুরোধ জানানো হয় form তবে ["প্রক্রিয়া"] খালি থাকবে না


0

বোতামের উভয়কেই নাম দিন এবং ফর্মটি থেকে মানটি পরীক্ষা করুন।

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

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

নিয়ামক দিকে:

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

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

0

কোর ২.২ রেজার পৃষ্ঠায় এই বাক্য গঠনটি কাজ করে:

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

এটি কার্যকর হতে পারে তবে আমি পরামিতি string submitবনাম লেখার পছন্দ করি string submit = Request.Form["Submit"];। রেজার পেজ এবং / বা এমভিসি এর বৃহত্তম সুবিধাগুলির মধ্যে একটি হল পদ্ধতিগুলির পাঠযোগ্যতা, অন্যথায় এটি পিএইচপি হতে পারে।
yzorg
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.