使用ASP.Net MVC的Ambigous路线

时间:2010-02-24 18:51:22

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

到目前为止,我仍然有标准路由。我试图做的是

public Foo : Controller
{
    public ActionResult Index(int id)
    {
        return View("List", repo.GetForId(id));
    }

    public ActionResult Index()
    {
        return View("List", repo.GetAll());
    }
}

我输入的网址是     本地主机/美孚/索引。 我认为它很聪明,可以找出我想要的方法。我得到的只是一个错误,告诉我这个电话是不明确的。从阅读路线教程我认为这将有效。我错过了什么?

抱歉:

重复。我投票结束。

1 个答案:

答案 0 :(得分:2)

方法重载(具有相同名称的两个操作)解析基于HTTP谓词。这意味着如果您想要使用相同名称的两个操作,则需要通过它们接受的HTTP谓词来区分它们:

public ActionResult Index(int id)
{
    return View("List", repo.GetForId(id));
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index()
{
    return View("List", repo.GetAll());
}

因此,当您致电GET /Home/Index时,将调用第一个操作,当您调用POST /Home/Index时,将调用第二个操作。

另请注意,您应该使用可空整数作为id参数,因为如果请求中没有传递参数,则模型绑定器将失败。

一种RESTful方式来处理这个问题,遵循我建议的惯例:

public ActionResult Index()
{
    return View(repo.GetAll());
}

public ActionResult Show(int id)
{
    return View(repo.GetForId(id));
}

允许您处理/Home/Index/Home/Show/10个请求。您可能也会有不同的观点,因为第一个会被强烈输入IEnumerable<T>,而第二个会被强加到T