MVC - Маршрут со строкой запроса - PullRequest
2 голосов
/ 15 марта 2012

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

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: / Фильмы / SearchIndex / Комедии / Шерлок

Но когда я фильтрую с помощью кнопки «фильтр» в SearchIndex.cshtml, я получаю следующий URL: / Movies / SearchIndex? MovieGenre = Comedy & searchString = Sherlock

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

Ответы [ 2 ]

2 голосов
/ 15 марта 2012

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

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

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

...