Наилучший подход состоит в том, чтобы отдельные действия обрабатывали различные вызовы кнопок, как описано в этой статье .
Если вы хотите, чтобы одно уродливое действие выполняло все эти вещи, вы могли бы датьназвания кнопок отправки:
@using (Html.BeginForm())
{
... input fields for the model
<button type="submit" name="btn" value="verify">Verify data</button>
<button type="submit" name="btn" value="save">Save data</button>
<button type="submit" name="btn" value="redirect">Redirect</button>
}
Вам не нужны скрытые поля или JavaScript.А затем в вашем действии контроллера вы проверите значение параметра btn
(который, очевидно, будет частью вашей модели представления):
[HttpPost]
public ActionResult Foo(MyViewsModel model)
{
if (model.Btn == "verify")
{
// the Verify button was clicked
}
else if (model.Btn == "save")
{
// the Save button was clicked
}
else if (model.Btn == "redirect")
{
// the Redirect button was clicked
}
else
{
// ??? throw
}
...
}
Конечно, если вы последуете моему совету и отделите свои действия(как указано в статье):
@using (Html.BeginForm("Action", "Home"))
{
... input fields for the model
<input type="submit" name="verify" value="Verify data" />
<input type="submit" name="save" value="Save data" />
<input type="submit" name="redirect" value="Redirect" />
}
, а затем:
[HttpParamAction]
[HttpPost]
public ActionResult Verify(MyViewModel model)
{
...
}
[HttpParamAction]
[HttpPost]
public ActionResult Save(MyViewModel model)
{
...
}
[HttpParamAction]
[HttpPost]
public ActionResult Redirect(MyViewModel model)
{
...
}
, который является гораздо более чистым кодом, который не нарушает принцип единой ответственности.