在我的控制器中,我有两个名为“朋友”的动作。执行的那个取决于它是否是“获取”而不是“帖子”。
所以我的代码片段看起来像这样:
// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends()
{
// do some stuff
return View();
}
但是,由于我有两个具有相同签名的方法(Friends),因此无法编译。我该怎么做呢?我是否只需要创建一个操作但区分其中的“获取”和“发布”?如果是这样,我该怎么做?
答案 0 :(得分:114)
将第二种方法重命名为“Friends_Post”之类的其他方法,然后您可以将[ActionName("Friends")]
属性添加到第二种方法。因此,使用POST作为请求类型的Friend操作请求将由该操作处理。
// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
// Post:
[ActionName("Friends")]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends_Post()
{
// do some stuff
return View();
}
答案 1 :(得分:20)
如果你真的只想要一个例程来处理这两个动词,试试这个:
[AcceptVerbs("Get", "Post")]
public ActionResult ActionName(string param1, ...)
{
//Fun stuff goes here.
}
一个潜在的警告:我正在使用MVC版本2.不确定MVC是否支持这个版本1. AcceptVerbs的Intellisense文档应该让你知道。
答案 2 :(得分:6)
尝试使用:
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
答案 3 :(得分:2)
不完全确定它是否是正确的方法,但我会使用无意义的参数来区分sigs。像:
// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends(bool isGet)
{
// do some stuff
return View();
}
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends()
{
// do some stuff
return View();
}
我知道这很丑陋,但它确实有效。
答案 4 :(得分:2)
将cagdas的回应标记为答案,因为它回答了我的问题。但是,由于我不喜欢在项目中使用ActionName属性,因此我使用了不同的解决方案。我只是将FormCollection添加到“post”操作(最终更改方法签名)
// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(FormCollection form)
{
// do some stuff
return View();
}
答案 5 :(得分:1)
在Post方法中添加要在帖子中接收的参数。也许是这样的:
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(string friendName, string otherField)
{
// do some stuff
return View();
}
..或者如果你有一个复杂的类型,像这样:
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(Friend friend)
{
// do some stuff
return View();
}
修改:最好使用更多类型的方法来接收发布的项目,如上所述。
答案 6 :(得分:0)
你的动作方法不能做同样的事情,否则就没有必要写两个动作方法。因此,如果语义不同,为什么不为动作方法使用不同的名称呢?
例如,如果您有一个“删除”操作方法并且GET只是要求确认,您可以调用GET方法“ConfirmDelete”,POST方法只需“删除”。
不确定这是否符合你的情况,但是当我遇到同样的问题时,它总是对我有用。