【问题标题】:Route with Two optional parameters in MVC3 not workingMVC3中带有两个可选参数的路由不起作用
【发布时间】:2012-12-19 15:19:27
【问题描述】:

我的应用程序中使用了以下类型的 url。

localhost/admin/userdetail/id

localhost/admin/userdetail/id/true

localhost/admin/userdetail/id/true/success

这是我的管理控制器

bool inSaveAction,字符串状态可选

    [Authorize]
    public ActionResult UserDetail(string Id, bool inSaveAction, string status)
    {
    }

    [HttpPost, Authorize, ValidateAntiForgeryToken]
    public ActionResult SaveUserDetail(UserDetailViewModel viewModel)
    {
        User userToSave = new User();
        AdminService.UpdateUser(userToSave);
        //This is calling the above function as it sending all 3 params
        return RedirectToAction("UserDetail", new { Id = viewModel.Id, 
                           inSaveAction = true, status = "success" });
    }

以下情况不起作用

  @Html.ActionLink("DisplayName", "UserDetail", new { id = Model.Id })

在 Global.asax 中

 routes.MapRoute("UserDetail",
            "UserDetail/{id}",
            new
            {
                controller = "Admin",
                action = "UserDetail",
                id = UrlParameter.Optional
            }
         );

我关注了http://haacked.com/archive/2011/02/20/routing-regression-with-two-consecutive-optional-url-parameters.aspx

如何将 inSaveAction 和 status 作为我的 UserDetail 操作的可选参数?

【问题讨论】:

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


    【解决方案1】:

    您缺少路由配置中的参数。为了使这个工作与不同的参数可选(如菲尔哈克的帖子),你需要定义多个路由

    routes.MapRoute("UserDetail-WithStatus", 
                    "UserDetail/{id}/{inSaveAction}/{status}", 
                     new
                     {
                         controller = "Admin",
                         action = "UserDetail",
                         // nothing optional 
                     }
    );
    
    routes.MapRoute("UserDetail-WithoutStatus", 
                    "UserDetail/{id}/{inSaveAction}", 
                     new
                     {
                         controller = "Admin",
                         action = "UserDetail",
                         // nothing optional 
                     }
    );
    
    routes.MapRoute("UserDetail-WithoutSaveAction", 
                    "UserDetail/{id}", 
                     new
                     {
                         controller = "Admin",
                         action = "UserDetail",
                         id = UrlParameter.Optional
                     }
    );
    

    然后创建链接:

    @Html.ActionLink("Link", "Index", "Admin", new { id = 1, inSaveAction = true, success = "success" }, null)
    

    您还需要将可选参数设置为可为空,否则如果 id 或 inSaveAction 缺失,您将获得异常。

    public ActionResult UserDetail(int? id, bool? inSaveAction, string status)
    {
    
    }
    

    【讨论】:

    • 我用你给的代码试过了。这也行不通。它没有采取行动方法。路由或操作方法参数有问题吗?
    • 我刚刚发布了一个编辑,您需要将 id 和 inSaveAction 设为可空。什么不工作?我对此进行了测试,所有路线都有效。
    • 谢谢。状态也是可选的。
    • 对不起,你是什么意思?你能验证路线是否有效吗?在 UserDetail 操作中设置断点,然后尝试使用 URL /Admin/UserDetail/1、/Admin/UserDetail/1/true、/Admin/UserDetail/1/true/success。一切都应该工作,并设置相应的参数。
    • 在所有情况下,我都必须传递 ID。那么我们可以删除最后一条说可选参数的路由吗?
    猜你喜欢
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 2016-10-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多