2010-02-24 44 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