У мене на MVC-формі є дві кнопки:
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
З моєї дії Controller як я дізнаюся, на кого натискали?
У мене на MVC-формі є дві кнопки:
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
З моєї дії Controller як я дізнаюся, на кого натискали?
Відповіді:
Назвіть обидві кнопки надсилання однаково
<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();
}
<button type="submit" name="action" value="draft"> Internationalized Save Text </button>
для цілей i18n, тому рядок, що стикається з користувачем, може бути налаштований, а імена елементів форми ніколи не піддаються безпосередньо користувачеві (що не дивно саме по собі)
<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
}
}
це краща відповідь, тому ми можемо мати як текст, так і значення для кнопки:
</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, його ще більш потужним, оскільки ваше не зобов'язане подати ім'я або кнопку в параметрах методу контролера, ви можете викликати його як завгодно ...
ви можете ідентифікувати свою кнопку звідти тегом імені, як показано нижче. Потрібно перевірити так, як у вашому контролері
if (Request.Form["submit"] != null)
{
//Write your code here
}
else if (Request.Form["process"] != null)
{
//Write your code here
}
Ось дійсно приємний і простий спосіб зробити це за допомогою дуже просто слідувати інструкціям за допомогою спеціального MultiButtonAttribute:
Підводячи підсумки, зробіть кнопки для надсилання таким чином:
<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;
}
}
MultiButtonAttribute
спеціальні атрибути, які дозволяють розрізняти кнопки подання. Насправді досить приємна ідея.
Arnis L.
дотримувались тієї ж поради, ви, можливо, помітили, що він надавав саме таку посилання 4 роками раніше:>
// 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
}
}
коли користувач подає сторінку за допомогою однієї з кнопок, лише один з аргументів матиме значення. Я думаю, це буде корисно для інших.
Оновлення
Ця відповідь досить стара, і я фактично переглядаю свою думку. можливо, вище рішення добре для ситуації, яка передає параметр властивостям моделі. не турбуйтеся і приймайте найкраще рішення для свого проекту.
input[type=submit]
значення, яке було викликано, тож вони зможуть усі моделі прив'язувати до властивості з однаковим name
(наприклад action
), а потім ви можете розмежувати кнопки на основі value
цього рядка без необхідності вводити в зміну підпису багато змінних . Будь ласка, трохи часу поміркуйте над форматуванням / відступом перед публікацією.
Дайте ім’я обом кнопкам і отримайте чек із форми.
<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 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)
{
.......
string submit
проти написання string submit = Request.Form["Submit"];
. Однією з найбільших переваг сторінок Razor та / або MVC є читабельність методів, інакше це може бути PHP.
<input name="submit" type="submit" id="submit" value="Save" onclick="saveMethod" />
:?