0

假设我有一个包含 2 个表单的页面,它们都在同一页面上提交不同的数据,一个提交两个 ID,另一个只提交 1 个 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() 视图。

4

1 回答 1

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 形式启动第二个请求,并防止在刷新时出现弹出窗口。

于 2013-09-18T23:22:31.317 回答