2016-12-29 55 views
0

我的要求是將一條URL(例如:http://www.mywebsite.com/的HelloWorld)到所需控制器(家庭),並且動作(索引類型= 1 &模式=視圖?)動態。在這裏我保存傳入的URL,目標控制器+動作+查詢字符串參數在數據庫中。爲此,我使用繼承MvcRouteHandler的自定義路由處理程序,並且在處理程序的GetHttpHandler方法中,我使用控制器名稱,操作,參數等更新路由數據值。這些工作都很好,但問題是我無法檢索查詢字符串params使用Request.Querystring [「type」],但可能獲取值作爲操作參數或從Request.RequestContext.RouteData.Values [「type」]。誰能告訴我,我們需要的變化,使使用的Request.QueryString發送新查詢字符串PARAMS到動作使用MVC定製路由

 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

查詢字符串PARAMS得到的值不是路線的一部分,但ModelBinder的將處理它們一樣的路線PARAMS。換句話說,如果你想捕捉那些特定的查詢字符串值在你的行動,只是它們指定爲PARAMS到你的動作:

public ActionResult Index(int type, string mode) 

現在,就自動將它們添加到URL,這是不是真的有可能。同樣,因爲查詢字符串不是路由的一部分,所以不能在路由中指定某個查詢字符串參數應該存在。但是,您可以設置重定向。例如,你可以有響應/helloworld路線的動作,然後重定向到你想要的網址:

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

或者,您可以添加URL在IIS中直接改寫重定向從/helloworld/home/index?type=1&mode=view。只要注意,無論採用哪種方法,地址欄中的實際URL都會更改爲查詢字符串中的實際URL。基本上,/helloworld路由只是一個簡短的URL,可以讓人們更容易,但實際上永遠不會顯示在地址欄中。

如果你需要保持/helloworld URL,那麼你只需要簡單地創建一個路由,處理查詢字符串PARAMS爲默認值:

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

然後:

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