MVC3 中带有两个可选参数的路由不起作用 [英] Route with Two optional parameters in MVC3 not working

查看:17
本文介绍了MVC3 中带有两个可选参数的路由不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

<块引用>

localhost/admin/userdetail/id

localhost/admin/userdetail/id/true

localhost/admin/userdetail/id/true/success

这是我的管理员控制器

<块引用>

bool inSaveAction,字符串状态可选

 [授权]public ActionResult UserDetail(string Id, bool inSaveAction, string status){}[HttpPost、授权、验证AntiForgeryToken]公共 ActionResult SaveUserDetail(UserDetailViewModel viewModel){User userToSave = new User();AdminService.UpdateUser(userToSave);//这是调用上面的函数,因为它发送了所有3个参数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}",新的{控制器 = "管理员",action = "UserDetail",id = UrlParameter.Optional});

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

我如何制作 inSaveAction &状态作为我的 UserDetail 操作的可选参数?

解决方案

您的路由配置中缺少参数.为了使用不同的可选参数(如 Phil Haack 的帖子中所述),您需要定义多个路由

routes.MapRoute("UserDetail-WithStatus","UserDetail/{id}/{inSaveAction}/{status}",新的{控制器 = "管理员",action = "UserDetail",//没有可选的});routes.MapRoute("UserDetail-WithoutStatus","UserDetail/{id}/{inSaveAction}",新的{控制器 = "管理员",action = "UserDetail",//没有可选的});routes.MapRoute("UserDetail-WithoutSaveAction","UserDetail/{id}",新的{控制器 = "管理员",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){}

I have a following types of url used in my Application.

localhost/admin/userdetail/id

localhost/admin/userdetail/id/true

localhost/admin/userdetail/id/true/success

Here is my Admin Controller

bool inSaveAction, string status are optional

    [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" });
    }

Below case is not working

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

In Global.asax

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

I followed http://haacked.com/archive/2011/02/20/routing-regression-with-two-consecutive-optional-url-parameters.aspx

How can i make inSaveAction & status as optional parameter for my UserDetail action?

解决方案

You're missing the parameters in your route config. In order to make this work with different parameters optional (as in Phil Haack's post), you need to define multiple routes

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
                 }
);

And then create links with:

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

You'll also need to set the optional parameters as nullable, otherwise you'll get exceptions if id or inSaveAction are missing.

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

}

这篇关于MVC3 中带有两个可选参数的路由不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆