假设我有一个包含2个表单的页面,这两个表单都在同一页面上提交不同的数据,一个提交两个ID,另一个只提交一个ID。他们都回到同一页面(本身)。以下是HTML的样子......
<form method="post">
<select name="regID">
...
</select>
<select name="jobID">
...
</select>
<input type="submit" value="Add">
</form>
<form method="post">
<button name="ID" type="submit" value="@ID">Remove</button>
</form>
现在,要处理控制器中的第一个表单,我可以
[HttpPost]
public ActionResult Index(int regID, int jobID)
{
....
}
但是,如果我尝试通过添加
来处理第二种形式 [HttpPost]
public ActionResult Index(int ID)
{
....
}
当我点击提交按钮时,我现在会收到错误
The current request for action 'Index' on controller type 'UserJobController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult Index(Int32) on type careerninja.Controllers.UserJobController
System.Web.Mvc.ActionResult Index(Int32, Int32) on type careerninja.Controllers.UserJobController
那么,控制器是否有可能使用不同的值重载[HttpPost]方法来处理2组不同的表单数据,或者这是不可能的?还有其他解决方案我可能不会抓住这个问题吗?
基本上,对于第二种形式,我想要一个“删除”按钮,单击该按钮时,调用控制器删除该项,删除该项,然后返回Index()视图。
答案 0 :(得分:3)
我认为您设计的改进会使您不再有问题。听起来你相信一切都可能需要通过你的Index()
方法,但事实并非如此。将方法的名称重新设计为动作正在执行的行为通常是我如何命名我的方法。
基本上,对于第二种形式,我希望有一个“删除”按钮,单击该按钮时,调用控制器删除该项,删除该项,然后返回Index()视图。
因此,请创建名为Remove()
的方法,并将其重定向到Index()
public ActionResult Remove(int id)
{
// do some work
this.RedirectToAction("Index");
}
我建议你的方法名称代表他们正在做的事情。
public ActionResult Add(int regID, int jobID)
{
// do some work
this.RedirectToAction("Index");
}
注意:这也是用户界面的重要设计。当页面通常对服务器执行POST,然后服务器返回HTML时,如果用户决定刷新页面,则通常会显示弹出窗口,询问他们是否要重新提交数据。相反,前面的示例执行了服务器端重定向,它将第二个请求作为GET启动,并防止弹出在刷新时发生。