【问题标题】:ASP.net MVC route parameter exceptionASP.net MVC 路由参数异常
【发布时间】:2012-03-02 11:42:21
【问题描述】:

我有一个带有 userId 参数的操作:

~/Users/Show?userId=1234

一切正常,除非提供的 userId 不是 int 或丢失。

然后它抛出这个异常:

            Message: The parameters dictionary contains a null entry for parameter 'userId' of 
    non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Show(Int32, 
System.Nullable`1[System.Boolean], System.String)' in 'S4U.Web.Mvc.Controllers.ProfileController'. An optional parameter must be a reference type, 
    a nullable type, or be declared as an optional parameter.
        Parameter name: parameters

..之后用户被重定向到错误页面。

如何配置路由以使该操作根本不被命中而引发 404?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing


    【解决方案1】:

    不要使用下面某处建议的字符串。使用:

    public ActionResult (int userId = 0)
    {
    
    }
    

    这是最好的做法。

    你也可以这样做:

    public ActionResult (int? userId)
    {
        if (userId.HasValue)
        {
            //...
        }
    }
    

    【讨论】:

      【解决方案2】:

      正如我在对 Ufuk Hacıoğulları 的回答的评论中提到的,您应该通过向路由添加约束来处理验证,如果参数可以为空,则通过具有可为空的类型。

      对于前一种方法,如果您有适当的约束,这意味着您的路线将不会被拾取 - 您将需要捕获所有路线或其他错误处理。对于可为空的类型,您可以在操作中测试它是否有值并采取相应措施。

      将动作参数保持为强类型是一种目标模式。

      【讨论】:

        猜你喜欢
        • 2012-10-06
        • 2011-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-21
        • 1970-01-01
        • 2012-09-12
        相关资源
        最近更新 更多