Вопрос

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

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

Другие советы

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

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

http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-tame-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");
...

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

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

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

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

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

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

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

На этот пост не будет отвечать на 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
    }
}

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

Обновлять

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

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

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

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

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

Разве вы не узнаете, используя коллекцию request.form? Если процесс нажимается, request.form ["Процесс"] не будет пусты

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top