我如何根据所单击的提交按钮的名称使Controller的行为有所不同?

时间:2018-11-01 15:06:44

标签: c# asp.net-mvc

由于我对MVC和Web开发非常陌生,请对我放轻松。

我继承了一个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对象正在传递给此方法。我发现this answer看起来确实很有希望,但是,对于如何改造现有代码,我有些困惑:

  • 在我拥有的cshtml中,我正在Html.BeginForm中传递方法名称。是否存在BeginForm的排列,其中无需对提交按钮方法进行硬编码?
  • 此外,我仍然能够将FormCollection对象传递给控制器​​方法(与链接的答案中所示的MessageModel对象相反)吗?

1 个答案:

答案 0 :(得分:1)

您链接到的帖子很旧。现在,假设目标环境支持html属性,则可以使用html属性完成所有工作。通过使用此方法,您可以保留现有参数,而不会遇到任何麻烦。

首先,您需要为每个按钮在控制器上进行操作。

因此,将SaveServiceWindow分成两个动作,例如AddGroupRemoveGroup

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

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

第二,在按钮上,您可以使用属性formactionformmethod指定您的新操作之一。

<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,您会看到兼容性表。您还可以在formactionformmethod上看到更多信息。

编辑: 一些其他提示。

生成表单时,请确保在测试时删除当前的发布信息:

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

@using ()
{
}

由于在输入中指定了formaction和formmethod,因此在表单上不需要它们。

要确保生成正确的链接,请右键单击输入,然后单击检查。查看输入属性是什么,并确保它们正确。

由于您对Web开发的经验不是很丰富(以您自己的话说,没有粗鲁的经验),因此建议您在HTML forms.上阅读一些基本信息,无论何时生成POST请求且不使用AJAX,您需要一个表格来提交数据。然后,take a look介绍如何使用Razor引擎在MVC中完成此操作。