2009-09-21 70 views
1

我有:asp.net MVC使用可選參數和局部視圖

AlbumsController PhotoRepository 的Index.aspx(視圖)

的Index.aspx的內部,我有一個局部視圖呼叫AlbumControl。我想通過ajax和ajaxhelper更新它。

的問題是,我想要做以下的能力:

http://www.mysite.com/Albums
http://www.mysite.com/Albums?FilterTag=Birthdays

當我這樣做,我得到以下錯誤:

採取行動的當前請求控制器類型'AlbumsController'上的'Index'在以下操作方法之間不明確:

System.Web.Mvc.ActionResult指數上型Controllers.AlbumsController型Controllers.AlbumsController System.Web.Mvc.ActionResult指數()(System.String)

我本來以爲asp.net的MVC如果我在查詢字符串中傳入一個參數,它會去索引(字符串標籤)方法,如果我沒有傳入參數,它會去索引()。

意見建議?

回答

4

的問題是,MVC路由引擎不能告訴之間的區別: -

1)調用index()

2)調用指數(字符串標籤)與標籤= null

這就是爲什麼它說請求不明確。

你可以這樣做: -

public ActionResult Index(string tag) 
{ 
    if(String.IsNullOrEmpty(tag)) 
    { 
    // index code goes here 
    return View("Index"); 
    } 
    else 
    { 
    // code to handle filtered view goes here 
    return View("Tag"); 
    } 
} 

,或者您可以強制參數與自定義屬性要求: -

ASP.NET MVC ambiguous action methods

,或者你可以設置路由,使專輯和相冊?FilterTag = X明確地採取不同的行動(順便說一下,我建議「相冊」和「專輯/ X」): -

routes.MapRoute("AlbumsIndex", "Albums", 
    new { controller = "Albums", action = "Index" }); 
    routes.MapRoute("AlbumsTag", "Albums/{tag}", 
    new { controller = "Albums", action = "Tag", tag = "" }); 
    routes.MapRoute("Default", "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = ""); 

and

public ActionResult Index() { ... } 
public ActionRestlt Tag(string tag) { ... } 
+1

幾乎我要打字的東西。就個人而言,我會爲它的屬性側拍更多的值,以便將值設置爲默認值(如果不存在)或將錯誤重定向。只是讓它更容易避免重複代碼,以防萬一它成爲一個參數。 – 2009-09-21 14:02:00

+0

Programmin工具 - 這裏的屬性方法是什麼? – leora 2009-09-21 15:30:39

+0

由於它不是構建到路由中的東西(IE在url中包含?和tag),可能只需檢查filterContext.ActionParameters以查看它是否存在。如果沒有,請添加它。如果它爲空,則設置一個默認參數。這只是如果你不想在實際的方法中檢查null。如果您不介意這樣做,那麼執行空字符串檢查示例可能會更快。 我使用屬性的東西,我知道會用在很多地方,如設置pageNumber爲0,如果它不存在。 – 2009-09-21 20:28:16