c# - 如何根据单击的提交按钮的名称让控制器的行为有所不同?
问题描述
请放轻松,因为我对 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 对象被传递给这个方法。我发现这个答案看起来很有希望,但是,我对如何改造现有代码有点困惑:
- 在我拥有的 cshtml 中,我在 Html.BeginForm 中传递了一个方法名称。是否存在不需要硬编码提交按钮方法的 BeginForm 排列?
- 另外,我是否仍然能够将 FormCollection 对象传递给控制器方法(而不是链接答案中指示的 MessageModel 对象)?
解决方案
您链接到的帖子很旧。您现在可以使用 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 文档以了解输入元素是否与您的环境兼容。进行搜索formaction
,您将看到兼容性表。您还可以在此处查看更多formaction
信息formmethod
。
编辑:一些额外的提示。
生成表单时,请确保在测试时删除当前的发布信息:
@using (Html.BeginForm("SaveServiceWindow", "Approve", FormMethod.Post, new { name = "SaveServiceWindow" }))
{
}
至
@using ()
{
}
由于在输入中指定了 formaction 和 formmethod,因此您不需要在表单上使用它们。
要确保生成正确的链接,请右键单击输入并单击检查。查看输入属性是什么并确保它们是正确的。
由于您对 Web 开发不是很有经验(用您自己的话来说,不是粗鲁),我建议您阅读一些有关HTML 表单的基本信息。每当您生成 POST 请求而不使用 AJAX 时,您都需要一个表单来提交您的数据。然后,看看如何使用 Razor 引擎在 MVC 中完成此操作。
推荐阅读
- interface - 为什么不能在接口上使用带有表达式的 C# 9
- python - 通过 Discord.py 获得角色
- https - HTTPS 代理服务
- java - 通过单选按钮从 Thymeleaf 获取输入,将包装对象中的列表返回给控制器
- javascript - 在节点中转换非统一时间戳?
- google-apps-script - Google Sheet 插件超时 ~ 45 秒?
- javascript - 使用 F12 键在戴尔笔记本电脑上调试 ASP .NET JavaScript
- javascript - IMDb 评级份额已本地化
- javascript - 为什么我的 javascript 在托管时停止工作?
- python - 如何在 Facebook 搜索并单击 Python selenium 中的第一个结果