我的要求是将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();
答案 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")