MVC, кнопка отправки которого нажата

У меня есть две кнопки в моей форме MVC:

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

Из моего действия контроллера, как узнать, какой из них был нажат?

+121
11 нояб. '09 в 9:22
источник поделиться
11 ответов

Назовите обе кнопки отправки те же

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

Затем в вашем контроллере получите значение submit. Только нажатая кнопка передает свое значение.

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();
}
+159
11 нояб. '09 в 10:26
источник
<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
    }
}
+47
11 нояб. '09 в 9:23
источник
другие ответы

Связанные вопросы


Похожие вопросы

это лучший ответ, поэтому мы можем иметь как текст, так и значение для кнопки:

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

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

и контроллер:

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

вкратце его кнопка SUBMIT, но вы выбираете имя, используя атрибут name, его еще более мощный, потому что вы не обязаны указывать имя или кнопку в параметрах метода контроллера, вы можете называть его, как вам нравится...

+32
07 янв. '13 в 11:14
источник

вы можете идентифицировать свою кнопку оттуда тегом имен, как показано ниже, Вам нужно проверить это в контроллере

if (Request.Form["submit"] != null)
{
//Write your code here
}
else if (Request.Form["process"] != null)
{
//Write your code here
}
+18
04 мая '16 в 9:29
источник

Здесь очень хороший и простой способ сделать это с помощью очень простых инструкций с использованием пользовательского MultiButtonAttribute:

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;
    }
}
+5
31 янв. '13 в 12:23
источник
// 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
18 сент. '14 в 14:24
источник

Этот пост не собирается отвечать на Coppermill, потому что ему уже давно ответили. Мой пост будет полезен для тех, кто ищет решение, подобное этому. Прежде всего, я должен сказать, что "решение WDuffy является полностью правильным", и оно отлично работает, но мое решение (не мое) будет использоваться в других элементах, и это делает уровень представления более независимым от контроллера (поскольку ваш контроллер зависит от "значение", которое используется для отображения метки кнопки, эта функция важна для других языков.).

Вот мое решение, дайте им разные имена:

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

когда пользователь отправляет страницу с помощью одной из кнопок, значение будет иметь только один из аргументов. Я думаю, это будет полезно для других.

Обновить

Этот ответ довольно старый, и я на самом деле пересматриваю свое мнение. Возможно, решение выше подходит для ситуации, когда параметр передается в свойства модели. не мешайте себе и найдите лучшее решение для вашего проекта.

+2
01 нояб. '13 в 2:27
источник

Чтобы было проще, я скажу, что вы можете изменить свои кнопки на следующее:

<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
31 июл. '14 в 7:38
источник

Присвойте обеим кнопкам имя и получите значение из формы.

<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;
 }
}
+1
01 мая '17 в 13:01
источник

В Core 2.2 Razor страниц этот синтаксис работает:

    <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)
       {
       .......
+1
15 мар. '19 в 23:35
источник

Можете ли вы не узнать, используя Collection.Form Collection? Если процесс щелкнут, request.form [ "process" ] не будет пустым

0
11 нояб. '09 в 9:24
источник

Посмотрите другие вопросы по меткам или Задайте вопрос