2010-02-24 46 views
0

到目前为止,我仍然有标准的路由。我试图做的是Ambigous路线中使用ASP.Net MVC

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

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

我输入的网址是 本地主机/美孚/索引。 我在幻想中已足够聪明地弄清楚我想要什么方法。我所能得到的只是一个错误,告诉我这个电话是有问题的。从阅读路线教程,我认为这将工作。我错过了什么?

对不起:

重复。我正在投票结束。

+0

什么你的路线是什么样子? global.asax中有什么? – 2010-02-24 18:53:45

回答

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

+0

这就是为什么我分裂他们。我希望有一个场景,我有一个方法处理一个ID和一个没有ID,因为它可能为空。这里的id参数基本上就像一个过滤器。所以如果它在那里,我想获得属于一个组的所有实体。如果没有id我只想让它获得所有的实体。有没有更好的方法来做到这一点? – uriDium 2010-02-24 19:03:49

+0

你的动词不应该放在另一个索引上吗?在我看来,没有参数的人不需要动词,而另一个人更可能拥有它。 – BenAlabaster 2010-02-24 19:05:10