2016-07-05 104 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

是的,你是对的。我编辑了我的行动结果以避免不必要的混淆。 :) –