59

在我的控制器中,我有两个称为“朋友”的动作。执行的取决于它是“获取”还是“发布”。

所以我的代码片段看起来像这样:

// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
    // do some stuff
    return View();
}

// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends()
{
    // do some stuff
    return View();
}

但是,这不会编译,因为我有两个具有相同签名的方法(朋友)。我该如何去创造这个?我是否只需要创建一个操作,但要区分其中的“获取”和“发布”?如果是这样,我该怎么做?

4

7 回答 7

127

将第二种方法重命名为“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();
}
于 2009-04-07T07:03:59.603 回答
25

如果你真的只想要一个例程来处理两个动词,试试这个:

[AcceptVerbs("Get", "Post")]
public ActionResult ActionName(string param1, ...)
{
//Fun stuff goes here.
}

一个潜在的警告:我使用的是 MVC 版本 2。不确定 MVC 1 是否支持这一点。AcceptVerbs 的 Intellisense 文档应该让您知道。

于 2010-07-12T03:05:11.890 回答
9

尝试使用:

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
public ActionResult Friends()
{
    // do some stuff
    return View();
}
于 2012-07-26T21:18:16.583 回答
3

不完全确定这是否是正确的方法,但我会使用无意义的参数来区分信号。像:

// 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();
}

我知道这很丑陋和骇人听闻,但它确实有效。

于 2009-04-07T07:04:30.490 回答
2

将 cagdas 的回答标记为答案,因为它回答了我的问题。但是,由于我不喜欢在我的项目中使用 ActionName 属性,所以我使用了不同的解决方案。我只是将 FormCollection 添加到“发布”操作中(最终更改了方法签名)

// 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();
}
于 2009-04-07T07:24:19.287 回答
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();
}

编辑:最好使用更多类型的方法来接收已发布的项目,如上所示。

于 2009-04-07T07:27:06.160 回答
0

你的动作方法不能做同样的事情,否则就没有必要编写两个动作方法。因此,如果语义不同,为什么不对动作方法也使用不同的名称呢?

例如,如果您有一个“删除”操作方法,而 GET 只是要求确认,您可能会调用 GET 方法“ConfirmDelete”而 POST 方法只是“删除”。

不确定这是否符合你的情况,但当我遇到同样的问题时,它总是对我有用。

于 2010-12-20T20:21:57.287 回答