2016-07-05 105 views
2

我收到以下錯誤,我的默認路由參數爲空。我在Controller中使用了相同的代碼,該代碼在URL中沒有任何參數,並且工作正常。我知道我的自定義路由被調用,但我不明白爲什麼startIndex和pageSize在操作中顯示爲null。MVC路由參數爲空

錯誤:

The parameters dictionary contains a null entry for parameter 'startIndex' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult ViewVcByStatus(System.String, Int32, Int32)' in 'AEO.WorkOrder.WebUI.Controllers.VendorComplianceController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.

Parameter name: parameters

控制器:

public ActionResult ViewVcByStatus(string status, int startIndex, int pageSize) { ... } 

路線:

routes.MapRoute("ViewVcByStatus", "ViewVcByStatus/{status}", 
    new 
    { 
    controller = "VendorCompliance", 
    action = "ViewVcByStatus", 
    startIndex = 0, 
    pageSize = WebConfigurationManager.AppSettings["PageSize"], 
    }); 

鏈接:

<a href="VendorCompliance/ViewVcByStatus?status=PROCESSED"> 

也試過這個環節產生了同樣的錯誤:

<a href="VendorCompliance/ViewVcByStatus/PROCESSED"> 
+0

你有其他可能匹配的路線嗎?此外,該網址與您在此處顯示的路線不符。 – DavidG

+0

唯一的其他路線是默認路線。我也嘗試過並獲得了相同的結果。 –

回答

1

發送startIndex和pageSize的與鏈接(我硬編碼它,使用參數代替),你的ActionResult期待該鏈接需要提供的所有參數,該圖路線可能會落空到默認路由,因爲它不可阻擋與一個參數匹配任何其他途徑與之相匹配您提供

<a href="VendorCompliance/ViewVcByStatus?status=PROCESSED&startIndex=0&pageSize=0"> 
+0

這工作。是不是在路線本身指定默認參數的整點,以避免必須在鏈接中指定它們? –

+1

正好相反。您創建了一個自定義路由,以便您可以找到解決MVC默認行爲的方法。但是不要輕易使用Route,當大多數人失敗時,他們就會成爲困難的案例。儘量使用正常的MVC模式,通過在邏輯和腳本中使用控制器或在視圖中使用剃鬚刀(例如)可能性。這也將使代碼更容易閱讀其他開發人員。許多人不理解自定義路由。 –

3

試試這個。

public ActionResult ViewVcByStatus(string status, int? pageSize, int?startIndex) 
    { 
     return View(); 
    } 

Route.config

routes.MapRoute(
      name: "ViewVcByStatus", 
      url: "ViewVcByStatus/{status}", 
      defaults: new { controller = "VendorCompliance", action = "ViewVcByStatus", startIndex = UrlParameter.Optional, pageSize = UrlParameter.Optional }); 

可選的參數應該被宣佈routeconfig可選的,並且將它們標記詮釋?在你的行動方法中,這將爲你做好工作。希望這有助於。這個解決方案將在您的問題「http://localhost:53290/VendorCompliance/ViewVcByStatus?status=PROCESSED」中與您的網址格式一起工作。

+2

這是將參數標記爲可以避免任何空輸入錯誤的最佳做法。如果你想通過URL傳遞它們,你可以VendorCompliance/ViewVcByStatus?status = PROCESSED&startIndex = 10&pageSize = 1。此外,您也可以將默認值分配給參數。有很多方法,它基本上取決於你的要求。希望我能插上飛機。 –

+1

路由部分是完全正確的,我應該指出,但錯過了它。剛剛注意到你編輯你的ActionResult也是正確的:) –

+2

是的,你是對的。我編輯了我的行動結果以避免不必要的混淆。 :) –