在MVC操作过滤器中重定向到路由时传递相同的操作参数

时间:2015-03-24 10:40:40

标签: asp.net-mvc routes asp.net-mvc-5 action-filter

我有一个动作过滤器,可以在满足某些条件时重定向到路线。

 public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (someValue)
        {
            filterContext.Result = new RedirectToRouteResult("MyCustomRoute", new RouteValueDictionary());
        }

        base.OnActionExecuting(filterContext);
    }

这是我的自定义路线:

routes.MapRoute("MyCustomRoute",
            "customRoute/",
            new { controller = "Custom", action = "CustomAction" },
            new[] { "CustomControllerNamespace" });

当用户导航到路线时触发此操作,例如:/someRoute?param1=1&param2=2&param3=3

当我调试动作过滤器时,我可以看到filterContext.ActionParameters内部我有2个模型,其中包含在网址中传递的参数。

这是我的行动:

 public ActionResult CustomAction(CustomModel model, CustomModel2 model2)
    {// do something}

此操作与原始操作具有相同的参数。

问题在于,当我从动作过滤器重定向到此动作时,模型和模型2中的参数为空。

如果我从RouteTable删除原始路由并创建一个具有相同名称和网址但具有不同控制器的路由,则会触发操作过滤器,当我重定向到CustomAction时,模型会填充值

当我重定向到另一条路线时,您知道如何通过ActionParameters吗?我不想在RouteValueDictionary内传递它们。 你知道为什么会这样吗?

修改

经过一些调整后,我发现我可以通过手动将每个参数传递给RouteValueDictionary来传递2个模型中的参数,我在RedirectToRouteResult中使用了这些参数。

var model = filterContext.ActionParameters["model"] as CustomModel;
            var model2= filterContext.ActionParameters["model2"] as CustomModel2;
            var routeValues = new RouteValueDictionary();

            if (model != null && model2!= null)
            {
                routeValues = new RouteValueDictionary(new
                {
                    Param1 = model.Param1,
                    Param2 = model.Param2,
                    Param3 = model2.Param3
                });
            }

filterContext.Result = new RedirectToRouteResult("MyCustomRoute", routeValues);

还有其他办法吗?我不认为这是一个很好的做法,如果添加或更改新属性,我将不得不更改此代码。

1 个答案:

答案 0 :(得分:-1)

据我所知,您无法将ViewModel(复杂对象)传递给RedirectToActionRedirectToRoute等方法。

有多种方法可以解决这个问题,其中一种方法是显示here TempData