Подтвердить что ты не робот

ASP.NET MVC 3 Несколько входов ввода в одну форму

В настоящее время у меня проблема с несколькими кнопками действий в одной и той же форме.

Первая кнопка выполнит проверку, а вторая кнопка сохранит профиль. Третий простой переадресовал бы пользователя из страницы, но они все равно должны пройти через контроллер некоторые отслеживания. Последняя кнопка удаляется. Поскольку они помещаются вместе, и мне нужно, чтобы ModelBinding проходил через POST, невозможно разделить их на несколько форм.

В настоящее время, чтобы различать, какое действие кликается, у меня есть скрытый ввод в моей форме и onclick, javascript будет обновлять скрытый ввод, чтобы он был передан обратно контроллеру.

Причина, по которой я это делал, состояла в том, что для некоторых странных причин FormCollection не хочет сохранять мои значения. Я попробовал доступ к кнопкам в контроллере через

formCollection["verify"]

Но это оказывается нулевым. И id, и имя входного представления установлены для подтверждения.

Я также пробовал много других предложений, таких как this и this, но безрезультатно. Есть ли лучший подход к моей проблеме без использования javascript для изменения скрытых входов?

4b9b3361

Ответ 1

Наилучший подход - иметь отдельные действия, обрабатывающие разные вызовы кнопок, как описано в в этой статье.

Если вы хотите, чтобы одно уродливое действие делало все, тогда вы могли бы указать имена кнопок отправки:

@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)
{
    ...
}

который является более чистым кодом, который не нарушает принцип единой ответственности.

Ответ 2

Я делаю что-то немного другое;

<input type="submit" name="submit" value="Save Draft" />
<input type="submit" name="submit" value="Publish" />

Затем вы можете получить значения с помощью;

FormCollection["submit"]

Спасибо,

Matt