Как я могу заставить Контроллер вести себя по-разному, в зависимости от имени нажатой кнопки отправки? - PullRequest
0 голосов
/ 01 ноября 2018

Пожалуйста, будьте спокойны, поскольку я очень новичок в MVC и веб-разработке в целом.

Я унаследовал веб-сайт ASP, на котором в настоящее время есть только кнопки «ОК» и «Отмена». Мне нужно разбить «ОК» на два отдельных действия («Добавить» и «Удалить»). «Отмена» все равно должна перенаправить пользователя обратно на домашнюю страницу сайта.

Вот cshtml:

<script type="text/javascript">
    var dict = {};
    function Cancel() {
        window.location = "/Home/Index/";
    }

</script>

@using (Html.BeginForm("SaveServiceWindow", "Approve", FormMethod.Post, new { name = "SaveServiceWindow" }))
{
	<!--
		Other form controls
	-->


        <tr><td>Desired Action:</td></tr>
        <tr>
            <td align="left" width="300">
                <input type="submit" value="Add Group" name="Add" id="submit" />
            </td>
            <td align="left" width="300">
                <input type="submit" value="Remove Group" name="Remove" id="submit" />
            </td>
            <td align="left" width="300">
                <input type="button" value="Cancel" onclick="Cancel();" />
            </td>
        </tr>
    </table>
}

А вот как объявляется метод Controller (я не включаю содержимое метода, поскольку оно не имеет отношения к вопросу):

[HttpPost]
public ActionResult SaveServiceWindow(FormCollection collection, TemporalApprovalModel approvalInfo)
    {
    }

Я вижу, что объект FormCollection передается этому методу. Я нашел этот ответ , который выглядит действительно многообещающим, однако я немного запутался в том, как модернизировать существующий код:

  • в cshtml, который я имею, я передаю имя метода в Html.BeginForm. Существует ли перестановка BeginForm, в которой метод кнопки отправки не нужно жестко кодировать?
  • Кроме того, смогу ли я по-прежнему передавать объект FormCollection в методы контроллера (в отличие от объекта MessageModel, как указано в связанном ответе)?

1 Ответ

0 голосов
/ 01 ноября 2018

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

Во-первых, вы захотите действие на вашем контроллере для каждой кнопки.

Итак, разделите SaveServiceWindow на два действия, например AddGroup и RemoveGroup.

[HttpPost]
public ActionResult AddGroup(FormCollection collection, TemporalApprovalModel approvalInfo)
{
}

[HttpPost]
public ActionResult RemoveGroup(FormCollection collection, TemporalApprovalModel approvalInfo)
{
}

Во-вторых, на ваших кнопках вы можете использовать атрибуты formaction и formmethod, чтобы указать одно из ваших новых действий.

<td align="left" width="300">
    <input type="submit" formmethod="post" formaction="@Url.Action("AddGroup", "{ControllerName}")" value="Add Group" name="Add" id="submit" />
</td>
<td align="left" width="300">
    <input type="submit" formmethod="post" formaction="@Url.Action("RemoveGroup", "{ControllerName}")" value="Remove Group" name="Remove" id="submit" />
</td>

где {ControllerName} - имя вашего контроллера. Вам может потребоваться изменить функцию @Url.Action для соответствия вашему приложению.

Когда вы нажимаете кнопку «Отправить», она вызывает правильное действие.

Пожалуйста, обратитесь к MDN Web Doc для элемента ввода, чтобы увидеть, совместимо ли это с вашей средой. Выполните поиск по formaction, и вы увидите таблицу совместимости. Вы также можете увидеть больше информации о formaction и formmethod там.

EDIT: Несколько дополнительных советов.

При создании формы обязательно удалите текущую информацию о публикации во время тестирования:

@using (Html.BeginForm("SaveServiceWindow", "Approve", FormMethod.Post, new { name = "SaveServiceWindow" }))
{
}

до

@using ()
{
}

Поскольку форматирование и метод формы указаны на входе, они не нужны в форме.

Чтобы убедиться, что генерируется правильная ссылка, щелкните правой кнопкой мыши на входе и выберите «Проверить». Посмотрите, что представляют собой входные атрибуты, и убедитесь, что они правильные.

Поскольку вы не очень разбираетесь в веб-разработке (своими словами, не хамите), я предлагаю вам прочитать некоторую основную информацию о формах HTML. Всякий раз, когда вы генерируете запрос POST и, не используя AJAX, вам потребуется форма для отправки ваших данных. Затем посмотрите , как это можно сделать в MVC с помощью движка Razor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...