使用mvc自定义路由将新的查询字符串参数发送到操作

时间:2016-12-29 12:33:08

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

我的要求是将URL(例如:http://www.mywebsite.com/ helloworld )动态路由到所需的控制器(home)和action(index?type = 1& mode = view)。这里我在数据库中保存传入的URL,目标控制器+动作+查询字符串参数。为此我使用继承MvcRouteHandler的自定义路由处理程序和处理程序的GetHttpHandler方法,我正在使用控制器名称,操作,参数等更新路由数据值。这些都工作正常,但问题是我无法检索查询字符串params使用Request.Querystring [“type”],但可以将值作为action params或从Request.RequestContext.RouteData.Values [“type”]获取。任何人都可以告诉我,我们需要使用Request.Querystring

来获取值
        routes.MapRoute(
            name: "CustomUrlRoute",
            url: "{*CustomUrl}",
            defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional },
            namespaces: new[] { "TestPortal.Controllers" },
            constraints: new { controller = @"^(?!services)\w+$" }
        ).RouteHandler = new CustomUrlRouteHandler();

1 个答案:

答案 0 :(得分:0)

查询字符串参数不是路径的一部分,但是模型绑定器将像路径参数一样处理它们。换句话说,如果要在操作中捕获这些特定的查询字符串值,只需将它们指定为操作的参数:

public ActionResult Index(int type, string mode)

现在,就自动将它们添加到URL而言,这是不可能的。同样,因为查询字符串不是路由的一部分,所以不能在路由中指定某些查询字符串参数应该存在。但是,您可以设置重定向。例如,您可以执行响应/helloworld路由的操作,然后重定向到所需的网址:

public ActionResult HelloWorld()
{
    return RedirectToAction("Index", "Home", new { type = 1, mode = "view" });
}

或者,您可以直接在IIS中添加URL重写,以便从/helloworld重定向到/home/index?type=1&mode=view。请注意,无论使用哪种方法,地址栏中的实际URL都将更改为带有查询字符串的URL。 /helloworld路线只是一个简短的网址,基本上是为了让人们更容易,但实际上永远不会在地址栏中显示。

如果您需要保留/helloworld网址,那么您只需要为其创建路由,并将查询字符串参数作为默认值处理:

routes.MapRoute(
    name: "HelloWorld",
    url: "helloworld",
    defaults: new { controller: "Home", action: "Index" }
);

然后:

public ActionResult Index(int type = 1, string mode = "view")