Форма бритвы MVC с несколькими различными кнопками отправки?
Razor view имеет 3 кнопки внутри формы. Для всех действий кнопки потребуются значения формы, которые в основном являются значениями, поступающими в поля ввода.
Каждый раз, когда я нажимаю любую из кнопок, он перенаправляет меня на действие по умолчанию. Подскажите, пожалуйста, как я могу отправить форму для различных действий на основе нажатия кнопки?
Я очень ценю ваше время, руководство и помощь.
14 ответов
Вы также можете попробовать это:
<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
}
Это элегантное решение работает для ряда кнопок отправки:
@Html.Begin()
{
// Html code here
<input type="submit" name="command" value="submit1" />
<input type="submit" name="command" value="submit2" />
}
И в методе действия ваших контроллеров примите его как параметр.
public ActionResult Create(Employee model, string command)
{
if(command.Equals("submit1"))
{
// Call action here...
}
else
{
// Call another action here...
}
}
В представлении
<form action="/Controller_name/action" method="Post>
<input type="submit" name="btn1" value="Ok" />
<input type="submit" name="btn1" value="cancel" />
<input type="submit" name="btn1" value="Save" />
</form>
в действии
string str =Request.Params["btn1"];
if(str=="ok"){
}
if(str=="cancel"){
}
if(str=="save"){
}
Вы можете использовать JS + Ajax. Например, если у вас есть какая-либо кнопка, вы можете сказать, что она должна делать при нажатии кнопки. Вот код:
<input id="btnFilterData" type="button" value="myBtn">
Вот ваша кнопка в html: в разделе скрипта вам нужно использовать этот код (этот раздел должен быть в конце документа):
<script type="text/javascript">
$('#btnFilterData').click(function () {
myFunc();
});
</script>
И, наконец, вам нужно добавить функцию ajax (в другом разделе скрипта, который должен быть помещен в начале документа):
function myFunc() {
$.ajax({
type: "GET",
contentType: "application/json",
url: "/myController/myFuncOnController",
data: {
//params, which you can pass to yu func
},
success: function(result) {
error: function (errorData) {
}
});
};
Это то, что сработало для меня.
formaction="@Url.Action("Edit")"
Фрагмент:
<input type="submit" formaction="@Url.Action("Edit")" formmethod="post" value="Save" class="btn btn-primary" />
<input type="submit" formaction="@Url.Action("PartialEdit")" formmethod="post" value="Select Type" class="btn btn-primary" />
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit( Quote quote)
{
//code
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult PartialEdit(Quote quote)
{
//code
}
Может помочь тому, кто хочет иметь 2 разных метода действия вместо одного, используя селекторы или клиентские скрипты.
Самое чистое решение, которое я нашел, заключается в следующем:
Этот пример - выполнить два совершенно разных действия; основная предпосылка состоит в том, чтобы использовать значение для передачи данных в действие.
По вашему мнению:
@using (Html.BeginForm("DliAction", "Dli", FormMethod.Post, new { id = "mainForm" }))
{
if (isOnDli)
{
<button name="removeDli" value="@result.WeNo">Remove From DLI</button>
}
else
{
<button name="performDli" value="@result.WeNo">Perform DLI</button>
}
}
Тогда в ваших действиях:
public ActionResult DliAction(string removeDli, string performDli)
{
if (string.IsNullOrEmpty(performDli))
{
...
}
else if (string.IsNullOrEmpty(removeDli))
{
...
}
return View();
}
Этот код должен легко изменяться, чтобы добиться вариаций по теме, например, измените имя кнопки на то же самое, тогда вам потребуется только один параметр в действии и т. Д., Как показано ниже:
По вашему мнению:
@using (Html.BeginForm("DliAction", "Dli", FormMethod.Post, new { id = "mainForm" }))
{
<button name="weNo" value="@result.WeNo">Process This WeNo</button>
<button name="weNo" value="@result.WeNo">Process A Different WeNo This Item</button>
}
Тогда в ваших действиях:
public ActionResult DliAction(string weNo)
{
// Process the weNo...
return View();
}
Попробуйте обернуть каждую кнопку в ее собственную форму на ваш взгляд.
@using (Html.BeginForm("Action1", "Controller"))
{
<input type="submit" value="Button 1" />
}
@using (Html.BeginForm("Action2", "Controller"))
{
<input type="submit" value="Button 2" />
}
Вы можете использовать обычные кнопки (без отправки). Используйте javascript, чтобы переписать (при событии "onclick") атрибут "action" формы на что-то, что вы хотите, а затем отправить его. Сгенерируйте кнопку с помощью пользовательского помощника (создайте файл "Helper.cshtml" в папке App_Code в корне вашего проекта).
@helper SubmitButton(string text, string controller,string action)
{
var uh = new System.Web.Mvc.UrlHelper(Context.Request.RequestContext);
string url = @uh.Action(action, controller, null);
<input type=button onclick="(
function(e)
{
$(e).parent().attr('action', '@url'); //rewrite action url
//create a submit button to be clicked and removed, so that onsubmit is triggered
var form = document.getElementById($(e).parent().attr('id'));
var button = form.ownerDocument.createElement('input');
button.style.display = 'none';
button.type = 'submit';
form.appendChild(button).click();
form.removeChild(button);
}
)(this)" value="@text"/>
}
И затем используйте это как:
@Helpers.SubmitButton("Text for 1st button","ControllerForButton1","ActionForButton1")
@Helpers.SubmitButton("Text for 2nd button","ControllerForButton2","ActionForButton2")
...
Внутри вашей формы.
Самый простой способ - использовать HTML5. FormAction
а также FormMethod
<input type="submit"
formaction="Save"
formmethod="post"
value="Save" />
<input type="submit"
formaction="SaveForLatter"
formmethod="post"
value="Save For Latter" />
<input type="submit"
formaction="SaveAndPublish"
formmethod="post"
value="Save And Publish" />
[HttpPost]
public ActionResult Save(CustomerViewModel model) {...}
[HttpPost]
public ActionResult SaveForLatter(CustomerViewModel model){...}
[HttpPost]
public ActionResult SaveAndPublish(CustomerViewModel model){...}
Есть много других способов, которые мы можем использовать, см. Эту статью ASP.Net MVC несколько кнопок использования кнопки по-разному
Помимо ответа @Pablo, для более новых версий вы также можете использовать помощник тега asp-page-handler.
На странице:
<button asp-page-handler="Action1" type="submit">Action 1</button>
<button asp-page-handler="Action2" type="submit">Action 2</button>
затем в контроллере:
public async Task OnPostAction1Async() {...}
public async Task OnPostAction2Async() {...}
Не нашел ответа с помощью помощников тегов (Core MVC), так что здесь (для действия удаления):
В HTML:
<form action="" method="post" role="form">
<table>
@for (var i = 0; i < Model.List.Count(); i++)
{
<tr>
<td>@Model.List[i].ItemDescription</td>
<td>
<input type="submit" value="REMOVE" class="btn btn-xs btn-danger"
asp-controller="ControllerName" asp-action="delete" asp-route-idForDeleteItem="@Model.List[i].idForDeleteItem" />
</td>
</tr>
}
</table>
</form>
На контроллере:
[HttpPost("[action]/{idForDeleteItem}"), ActionName("Delete")]
public async Task<IActionResult> DeleteConfirmed(long idForDeleteItem)
{
///delete with param id goes here
}
Не забудьте использовать [Route("[controller]")]
ДО объявления класса - на контроллере.
Информация получена из:http://www.codedigest.com/posts/46/multiple-submit-button-in-a-single-form-in-aspnet-mvc
Для тех, кто приезжает совсем недавно, вы можете использовать атрибут HTML 5 Formaction.
В вашей
<input>
или
<button>
Просто определите:
<button id="btnPatientSubmit" type="submit" class="btn btn-labeled btn-success" formaction="Edit" formmethod="post">
Обратите внимание на добавление form = "Edit", которое указывает, какой ActionResult я хочу передать в моем контроллере.
Это позволит вам иметь несколько кнопок отправки, каждая из которых может отправлять независимые ActionResults (методы) в вашем контроллере.
Этот ответ покажет вам, как работать в asp.net с бритвой, и управлять несколькими кнопками отправки события. Например, у нас есть две кнопки, одна из которых перенаправит нас на "PageA.cshtml", а другая - на "PageB.cshtml".
@{
if (IsPost)
{
if(Request["btn"].Equals("button_A"))
{
Response.Redirect("PageA.cshtml");
}
if(Request["btn"].Equals("button_B"))
{
Response.Redirect("PageB.cshtml");
}
}
}
<form method="post">
<input type="submit" value="button_A" name="btn"/>;
<input type="submit" value="button_B" name="btn"/>;
</form>
В случае, если вы используете чистую бритву, то есть нет контроллера MVC:
<button name="SubmitForm" value="Hello">Hello</button>
<button name="SubmitForm" value="World">World</button>
@if (IsPost)
{
<p>@Request.Form["SubmitForm"]</p>
}
Нажатие на каждую из кнопок должно отобразить Hello и World.