2012-03-15 1 views
2

После серии this Серия учебников MVC 4 Я сам пробовал некоторые вещи. Я начал с попытки сделать URL-адрес поискового фильтра дружественным. Следующий код является то, что я использую в данный момент:MVC - Маршрут с querystring

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)); 
      } 
     } 

Сейчас все идет хорошо, когда я ставлю следующий URL-адрес в моем adressbar: /Фильмы/SearchIndex/Комедия/Sherlock

Но когда я фильтр с «фильтром» кнопки в SearchIndex.cshtml я получаю следующий URL : /Фильмы/SearchIndex movieGenre = Комедия & SearchString = Шерлок

Кто знает эту проблему здесь?

ответ

2

Когда вы используете метод form = "get", ваш браузер объединит ваши поля формы в длинную цепочку. Это не имеет никакого отношения к самому MVC. Несколько решений:

  1. Обработайте событие отправки формы на стороне клиента и заново создайте URL-адрес по своему усмотрению.
  2. Создайте собственный поставщик маршрутов, который 301 перенаправляет ваш запрос обратно на «дружественный» URL-адрес.
+0

Вы избили меня до 4 секунд. 301-й хороший способ обхода; для другого проекта я пытался найти решение JavaScript, которое позволило бы генерировать маршрут на стороне клиента, но пока что мне не повезло (crossroads.js и др. сосредоточены на разборе маршрутов на стороне клиента). Есть предположения? – ehdv

+0

@ У вас есть учебник об этом? – Julian

+0

@ Жюлян сожалеет, не в это время, но для этого есть много ссылок. – Keith

1

Маршруты генерируются серверной стороной ASP.NET MVC: при нажатии кнопки фильтра браузер создает запрос GET: он не знает о маршрутах и ​​поэтому использует формат строки запроса ,