首页 > 解决方案 > 如何根据单击的提交按钮的名称让控制器的行为有所不同?

问题描述

请放轻松,因为我对 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 对象被传递给这个方法。我发现这个答案看起来很有希望,但是,我对如何改造现有代码有点困惑:

标签: c#asp.net-mvc

解决方案


您链接到的帖子很旧。您现在可以使用 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 文档以了解输入元素是否与您的环境兼容。进行搜索formaction,您将看到兼容性表。您还可以在此处查看更多formaction信息formmethod

编辑:一些额外的提示。

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

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

@using ()
{
}

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

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

由于您对 Web 开发不是很有经验(用您自己的话来说,不是粗鲁),我建议您阅读一些有关HTML 表单的基本信息。每当您生成 POST 请求而不使用 AJAX 时,您都需要一个表单来提交您的数据。然后,看看如何使用 Razor 引擎在 MVC 中完成此操作。


推荐阅读