Как этот контроллер может получить нужные ему значения? - PullRequest
0 голосов
/ 31 августа 2010

Допустим, я настроил структуру URL следующим образом (ASP.NET MVC2)

http://localhost:XXXX/Product/

Нажмите на ссылку, чтобы просмотреть по цвету

http://localhost:XXXX/Product/Color/

Нажмите на ссылку, чтобы просмотреть элементы красного цвета по типу (например, ручки)

http://localhost:XXXX/Product/Color/Red/Pen

В контроллере мне нужно будет сделать выбор на основе этих критериев. За исключением случаев, когда раньше я мог пойти

public ActionResult ShowTypesForColor(string color)

но для этого:

public ActionResult ShowItems(string type)

Мне также нужен цвет, который был выбран.

Как я мог это сделать? Является ли разделение строки URL единственным способом?

edit : возможно, я опередил себя в global.asax.cs

routes.MapRoute(null, "Product/Color/", new { controller = "Product", action = "ShowAllColors" });

routes.MapRoute(null, "Product/Color/{color}", new { controller = "Product", action = "ShowTypesForColor" });

routes.MapRoute(null, "Product/Color/{color}/{type}", new { controller = "Product", action = "ShowDetail" });

Я не думаю, что смогу определить последний как я могу? с двумя значениями {}?

Ответы [ 2 ]

1 голос
/ 31 августа 2010

Вы можете добавить несколько маршрутов в свой маршрут (например, {color} и {type}), но это не сработает так, как у вас там. Почему вы определили «Цвет» как второй сегмент вашего URL? Почему бы просто не сделать / Продукты / Красный и / Продукты / Красный / Ручка? Делать это непоследовательно ... / Цвета / Красный, а не ... / Типы / Перо, поэтому я бы просто полностью исключил классификаторы "Цвета" и "Типы".

Я бы определил ваш метод ShowItems () следующим образом:

public ActionResult ShowItems(string color, string type)

это позволит вам иметь маршрут типа / Products / Red / Pen, где ваш маршрут соответствует этому методу ShowItems (). Но вам все равно нужно будет отличить его от метода ShowTypesForColor (), где также принимает первый параметр цвета. Каркас маршрутизации будет просто обрабатывать тип как нулевой - для маршрута, который имеет оба токена, убедитесь, что у вас есть ограничение маршрута, указывающее, что ни цвет, ни тип не могут быть пустыми (то есть для маршрута ShowItems ()).

1 голос
/ 31 августа 2010

Ваш последний маршрут кажется вполне корректным. Он будет отображаться в действии с такой подписью:

ActionResult ShowDetails(string color, string type) {
  return View(/*view params*/);
}

РЕДАКТИРОВАТЬ Я думаю, что порядок неправильный, поэтому, если не запускается последний маршрут, попробуйте сделать следующее:

routes.MapRoute(null, "Product/Color/{color}/{type}", new { controller = "Product", action = "ShowDetail" });

routes.MapRoute(null, "Product/Color/{color}", new { controller = "Product", action = "ShowTypesForColor" });

routes.MapRoute(null, "Product/Color/", new { controller = "Product", action = "ShowAllColors" });

Порядок маршрутов MVC должен быть от наиболее конкретного к наименее конкретному, в противном случае наименее конкретный маршрут (/product/color/{color}) будет соответствовать URL-адресу product/color/red/pen перед более конкретным /product/color/{color}/{type}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...