如何区分在Asp.Net MVC中发布的路由?

时间:2010-05-16 19:48:10

标签: asp.net-mvc asp.net-mvc-2 routing asp.net-mvc-routing

我有两个动作,一个接受ViewModel,一个接受两个参数,一个字符串和一个int,当我尝试发布到动作时,它给了我一个错误,告诉我当前请求在两者之间是不明确的动作。

是否可以向路由系统指明哪个操作是相关的,以及它是如何完成的?

3 个答案:

答案 0 :(得分:3)

你可以用HttpGet HttpPost来装饰它

查看“覆盖HTTP方法动词”

http://www.asp.net/learn/whitepapers/what-is-new-in-aspnet-mvc

您还可以使用ActionName属性。查看“ActionNameAttribute”

http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx

答案 1 :(得分:1)

You can't overload controller actions,尽管Raj说,你可以通过允许他们回应不同的请求(获取,发布等)来区分他们。

您可能还会发现这有用:How a Method Becomes An Action

答案 2 :(得分:1)

这就是它的完成方式

简化示例:

[HttpGet] // this attribute is't necessary when there are only 2 actions with the same name
public ActionResult Update(int id)
{
    return View(new Repository().GetProduct(id));
}

[HttpPost]
public ActionResult Update(int id, Product product)
{
    // handle POST data
    var repo = new Repository();
    repo.UpdateProduct(product);
    return RedirectToAction("List");
}

如果您需要两个具有完全相同的签名(相同名称和相同类型的相同数量的参数)的操作,那么您将不得不使用其他属性,例如这样:

public ActionResult SomeAction(int id)
{
    return View(new Repository().GetSomething(id));
}

[HttpPost]
[ActionName("SomeAction")]
public ActionResult SomeActionPost(int id)
{
    // handle POST data
    var repo = new Repository();
    repo.UpdateTimestamp(id);
    return View(repo.GetSomething(id));
}