2016-11-14 33 views
-1

所以,我有如下問題ASP.NET,MVC - 爲什麼ActionResult的方法詢問默認的控制參數

我有一個觀點ActionResults方法: 均位於一個控制器 - TestController

public override ActionResult Index(int pageNumber, int pageSize, string nothing) 
{ 
    ... 
} 

public ActionResult getAJAX() 
{ 
    ... 
} 

我的世界文件的.asax:

routes.MapRoute(
    "getAJAX", 
    "{controller}/getAJAX", 
    new { action = "getAJAX" } 
); 

routes.MapRoute(
    "Test", 
    "{controller}/{action}/{id}", 
    new { controller = "Test", action = "Index", id = UrlParameter.Optional, pageNumber = 1, pageSize = 50 } 
); 

如果我打開site.com/TestController/getAJAX - 我收到以下錯誤

參數字典包含參數非空類型「System.Int32」的「PAGENUMBER」的方法「System.Web.Mvc.ActionResult指數(的Int32,的Int32,System.String)」

一個空條目

如果開site.com/TestController/getAJAX/1 - 一切都OK

爲什麼getAJAX要求其在其他方法參數?

+0

如果你去'〜/測試/ getAJAX'會發生什麼? –

+0

你的第一個路由定義期望第一個段是控制器名稱,所以要調用它你需要'.../Test/getAjax'(我假設你真正想要的是'url:「/ getAJAX」,默認值:new { controller =「Test」,action =「getAJAX」} –

+0

爲什麼你的'Index'方法是虛擬的?控制器不應該彼此繼承(除非它們被專門設計爲「基礎」控制器。 – Dai

回答

0

如果您的控制器稱爲TestController,然後到處都在你的網址,你需要使用Test(即Controller應該從URL刪除),例如,使用site.com/Test/getAJAX代替site.com/TestController/getAJAX

當您嘗試導航到site.com/TestController/getAJAX時,MVC正在尋找名爲TestControllerController的類,並且由於它不在那裏,所以使用了第二條路徑而不是第一條路徑。

此外,你並不需要在您的默認路由對象Controller,所以不是

new { controller = "TestController", action = "Index", id = UrlParameter.Optional, pageNumber = 1, pageSize = 50 } 

你應該使用

new { controller = "Test", action = "Index", id = UrlParameter.Optional, pageNumber = 1, pageSize = 50 } 
+0

謝謝。我犯了一個錯誤,開始發佈更新( – Fullbalanced

+0

@Fullbalanced我更新了答案 – dotnetom

+0

非常感謝。是的,絕對正確,這又是錯誤的代碼。但問題仍然存在 - 如果打開site.com/test/getAJAX - 出現錯誤,沒有足夠的參數,如果打開site.com/test/getAJAX/1 - 一切都OK。爲什麼它可以?getAJAX的ActionResult不需要任何額外的參數 – Fullbalanced

0

正如你在錯誤信息看行System.Web.Mvc.ActionResult Index(Int32, Int32, System.String)

它指向Index(...)而不是getAJAX()動作。

按圖路線在global.asax文件,getAJAX將努力爲"site.com/Test/getAjax"

而且"site.com/getAJAX"已與"TestController"路線作爲默認路由匹配。

解決方案: 變化圖路線爲getAJAX作爲

routes.MapRoute(
    "getAJAX", 
    "getAJAX", 
    new { controller="Test", action = "getAJAX" } 
); 
+0

我試過這個,和同樣的問題( – Fullbalanced

相關問題