2012-03-15 156 views
2

以下this MVC 4系列教程我自己嘗試了一些東西。 我開始試圖讓searchfilter url友好。下面的代碼是我使用的那一刻是什麼:MVC - 查詢字符串路由

的Global.asax

public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.MapRoute(
       name: "MovieSearch", 
       url: "Movies/SearchIndex/{movieGenre}/{searchString}", 
       defaults: new { controller = "Movies", action = "SearchIndex", movieGenre = UrlParameter.Optional, searchString = UrlParameter.Optional } 
      ); 

      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      );   
     } 
protected void Application_Start() 
     { 
       RegisterRoutes(RouteTable.Routes); 
     } 

SearchIndex.cshtml

<p> 
    @Html.ActionLink("Create New", "Create") 

    @using (Html.BeginForm("SearchIndex", "Movies", FormMethod.Get)) 
    { 
     <p> Genre: @Html.DropDownList("movieGenre", "All") 
       Title: @Html.TextBox("searchString")<br /> 
     <input type="submit" value="Filter" /></p> 
     } 
</p> 

MoviesController.cs

 // 
     // GET: /Movies/SearchIndex/Comedy/Sherlock 
     public ActionResult SearchIndex(string movieGenre, string searchString) 
     { 
      var GenreList = new List<string>(); 

      var GenreQry = from d in db.Movies 
          orderby d.Genre 
          select d.Genre; 

      GenreList.AddRange(GenreQry.Distinct()); 
      ViewBag.movieGenre = new SelectList(GenreList); 

      var movies = from m in db.Movies 
         select m; 

      if (!string.IsNullOrEmpty(searchString)) 
      { 
       movies = movies.Where(s => s.Title.Contains(searchString)); 
      } 

      if (string.IsNullOrEmpty(movieGenre)) 
      { 
       return View(movies); 
      } 
      else 
      { 
       return View(movies.Where(m => m.Genre == movieGenre)); 
      } 
     } 

現在一切都順利的時候,我把下列網址在我adressbar:/電影/ SearchIndex /喜劇/福爾摩斯

但是,當我在SearchIndex.cshtml我得到以下網址的「過濾器」按鈕篩選:/Movies/SearchIndex?movieGenre = Comedy & searchString = Sherlock

任何人都知道這裏的問題?

回答

2

當您使用form method =「get」時,您的瀏覽器會將您的表單字段連接到一個長查詢字符串中。這與MVC本身無關。幾種解決方案:

  1. 處理表單提交事件客戶端,並重新創建url,你認爲合適的。
  2. 創建一個自定義路由提供程序,將301查詢字符串重定向回「友好」網址。
+0

你打敗了我約4秒。 301是一個很好的解決方法;對於一個不同的項目,我一直在試圖找到一個允許客戶端路由生成的JavaScript解決方案,但到目前爲止我一直不太走運(crossroads.js等人專注於客戶端路由解析)。有什麼想法嗎? – ehdv 2012-03-15 13:40:33

+0

@Keith你有關於這個的教程? – Julian 2012-03-15 14:01:23

+0

@Julian抱歉,目前還沒有,但有很多參考資料。 – Keith 2012-03-15 22:16:50

1

通過ASP.NET MVC生成服務器端路由:當您按下過濾器按鈕時,瀏覽器正在創建GET請求:它不知道路由,因此它使用查詢字符串格式。