Проблема маршрутизации MVC 5 с новым URL-адресом для подкатегорий

В моем productcontroller у меня есть два метода возврата actionresult:

[Route("Shop/{brand}/{category}/{subcategory?}/{page:int?}")]
public ActionResult Index(string brand, string category, string subcategory, int? page, SortOptions currentSort = SortOptions.SinceDesc)
{ //... 

а также

[HttpPost]
[Route("Shop/{brand}/{category}/{subcategory?}/{page:int?}")]
public ActionResult Index(ProductsViewModel pvm)
{ //...

А это мой бритвенный взгляд:

@using (@Html.BeginForm("Index", "Products", FormMethod.Post))
{
    @Html.DropDownListFor(x => x.SubCatID, Model.SubCategoriesSelectList, new { @class = "multiselect" })
}

Когда я отправляю страницу, она попадает в метод httppost, но URL-адрес по-прежнему: Shop/nike/shoes, даже когда я выбрал подкатегорию кроссовки из раскрывающегося списка. Я хотел бы иметь такие URL-адреса:

  • магазин/найк/обувь
  • магазин/nike/обувь/кроссовки

Будучи больше парнем веб-формы, мне трудно переходить к новым URL-адресам и использовать свойства модели представления в качестве параметров.

edit опубликовал мой пользовательский интерфейс: введите описание изображения здесь, чтобы объяснить мой пользовательский интерфейс:

первое раскрывающееся меню должно get переходить в подкатегорию. например: магазин/nike/обувь/кроссовки

Второй должен опубликовать «назад», чтобы отсортировать продукты.

Ползунок цены должен вернуться, потому что он должен фильтровать. (будет фильтровать клиентскую сторону, если не будет пейджинга)

Пейджинг должен получиться так, чтобы вы могли ссылаться на определенную страницу: shop/nike/shoes/runningshoes/page2 и т. д.


person JP Hellemons    schedule 05.05.2015    source источник
comment
Значения формы не отражаются в маршруте (к счастью). Если вы хотите, чтобы этот URL-адрес был основан на выбранной подкатегории, вам необходимо перенаправить на метод GET (передав параметры)   -  person    schedule 05.05.2015


Ответы (1)


В вашем BeginForm(...) вам придется передать словарь значений маршрута с помощью Subcategory = "runningshoes"

Это смешивает значения, передаваемые GET, то есть в строке запроса через словарь значений маршрута, и POST, которые будут значениями из формы, но выполнят то, что вы пытаетесь сделать. Подробнее о перегрузке BeginForm(..) можно прочитать здесь на MSDN< /а>

У вас должно получиться:

@using (@Html.BeginForm("Index", "Products", new { subcategory = "runningshoes" }, FormMethod.Post))
{
    @Html.DropDownListFor(x => x.SubCatID, Model.SubCategoriesSelectList, new { @class = "multiselect" })
}

ИЗМЕНИТЬ

Только что понял, что вы хотите, чтобы значение из сообщения формы было в QueryString в ответе. Вместо того, чтобы возвращать представление непосредственно из вашего метода MVC для сообщения формы, вы могли бы сделать return RedirectToAction("ActionName", "ControllerName", new { subcategory = request.SubCategory });, в котором у вас было бы действие, которое специально поддерживало бы это перенаправление.

Дополнительную информацию о перенаправлении на действие можно найти здесь в MSDN.

person VulgarBinary    schedule 05.05.2015
comment
Хорошо, но у меня есть несколько раскрывающихся списков и другие параметры. Так мне нужна форма для каждого из них? например 4 раза <form ...></form на странице? Параметр подкатегории должен быть выбранным значением раскрывающегося списка. Я надеюсь, что вы меня понимаете :) спасибо за ваше время! - person JP Hellemons; 05.05.2015
comment
Если вы хотите, вы можете использовать вышеуказанное редактирование RedirectToAction и иметь только одну форму. Вы можете проверить различные параметры и перенаправить их соответствующим образом, создав полный URL-адрес, который вы в конечном итоге хотели бы иметь. Причина, по которой вы не видите подкатегорию в своем URL-адресе, заключается в том, что вы отправляете значение через POST, которое отправляет его в теле запроса вместо строки запроса. MVC поддерживает словарь RouteValue (или из значений маршрута анонимного объекта) для изменения URL-адреса с учетом определения маршрута. Я надеюсь, что это поможет, если не стесняйтесь уточнить, и я сделаю все возможное. - person VulgarBinary; 05.05.2015
comment
Ооооо или другой идеей было бы полностью отказаться от публикации формы и просто использовать Form.GET. Если это больше для целей навигации, вам в любом случае понадобятся функции GET больше, чем POST. Я отредактировал свой ответ, чтобы дать вам несколько вариантов. Любые вопросы, пожалуйста, спрашивайте! - person VulgarBinary; 05.05.2015
comment
Спасибо, обновил вопрос с пользовательским интерфейсом и действиями, которые я пытаюсь в него встроить. Хотелось бы узнать, какой подход лучше. - person JP Hellemons; 05.05.2015
comment
Путь, который я бы выбрал, будет либо подходом RedirectToAction, либо использованием FormMethod.GET для подключения к маршруту. Я знаю на 100%, что подход RedirectToAction будет работать, и я совершенно уверен, что FormMethod.GET вместо POST тоже должен работать. Оттуда это зависит от вас. Оба являются одинаково правильными решениями. - person VulgarBinary; 05.05.2015
comment
Пожалуйста, поправьте меня, если я ошибаюсь, но я могу оставить форму для публикации, чтобы увидеть новое значение раскрывающегося списка, а затем перенаправить на действие (что является получением), чтобы получить хороший URL-адрес? Потому что, когда я переключаю метод формы на получение, он не заполняет параметр подкатегории. - person JP Hellemons; 05.05.2015
comment
Давайте продолжим обсуждение в чате. - person JP Hellemons; 05.05.2015