ASP.NET MVC 3 многократных ввода данных в одной форме - PullRequest
20 голосов
/ 24 ноября 2011

У меня сейчас проблема с несколькими кнопками действий, которые находятся в одной форме.

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

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

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

formCollection["verify"]

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

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

Ответы [ 3 ]

34 голосов
/ 24 ноября 2011

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

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

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

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

1 голос
/ 24 ноября 2011

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

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

Тогда вы можете получить значения используя:

FormCollection["submit"]

Спасибо,

Matt

0 голосов
/ 13 сентября 2018
<input type="submit" name="nameONE" />
<input type="submit" name="nameTWO" />

            [HttpPost, ActionName("OrginalActionName")]
            [FormValueRequired("nameONE")]
            public ActionResult WhateverYouWantONE(type name)
            {
                code...
            }

            [HttpPost, ActionName("OrginalActionName")]
            [FormValueRequired("nameTWO")]
            public ActionResult WhateverYouWantTWO(type name)
            {
                code...
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...