发布并获得相同的方法签名

时间:2009-04-07 06:48:23

标签: asp.net-mvc post controller get asp-net-mvc-1

在我的控制器中,我有两个名为“朋友”的动作。执行的那个取决于它是否是“获取”而不是“帖子”。

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

// 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),因此无法编译。我该怎么做呢?我是否只需要创建一个操作但区分其中的“获取”和“发布”?如果是这样,我该怎么做?

7 个答案:

答案 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方法只需“删除”。

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