Рефакторинг моего маршрута, чтобы быть более динамичным - PullRequest
1 голос
/ 10 сентября 2009

В настоящее время моя структура URL выглядит следующим образом:

www.example.com / Хонда / www.example.com/honda/add www.example.com/honda/29343

У меня есть контроллер с именем HondaController.

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

Как я могу сохранить свой URL, как указано выше, но теперь поддерживаю:

www.example.com / брод www.example.com/toyota/add и т.д.

Я могу легко переименовать HondaController в CarController и просто передать строку «honda» или «toyota», и мой контроллер будет работать (сейчас он жестко запрограммирован в honda).

Возможно ли это? Я не уверен, как сделать маршрут динамическим на основе того, что у меня есть в базе данных.

Ответы [ 3 ]

3 голосов
/ 10 сентября 2009

Любая часть вашего маршрута может быть динамической, просто превращая ее в параметр маршрута. Поэтому вместо "/ honda / {action}" выполните:

/{manufacturer}/{action}

Это даст вам параметр «производитель», который был передан вашему методу действия. Таким образом, ваша подпись метода действия теперь может быть:

public ActionResult add(string manufacturer) { }

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

<ч /> Обновлено : Я имею в виду «вы должны удалить параметры по умолчанию» для маршрута по умолчанию: Если у вас есть:

route.MapRoute("Default", "/{controller}/{action}/{id}", 
                new { id = 1 }    // <-- this is the parameter default
              );

тогда этот маршрут будет соответствовать любому URL с двумя сегментами, а также любому URL с тремя сегментами. Таким образом, «/ product / add / 1» будет обрабатываться этим маршрутом, как и «/ product / add». Если вы удалите часть "new { id = 1 }", она будет обрабатывать только те URL, которые выглядят как "/product/add/1".

1 голос
/ 11 сентября 2009

Я сделал что-то подобное для гранита, так как хотел иметь контроллер материала, но у меня был такой URL:

черный / гранит / столешницы черный / кварц / столешница

и т.д.

я сделал этот маршрут:

routes.MapRoute("Quote", "quote/{color}/{surface}/{type}",
                        new {controller = "Quote", action = "surface"});

своп цитата для автомобиля, чтобы вы могли иметь:

машина / Honda / Accord

Ваш маршрут может тогда быть

routes.MapRoute("cars", "car/{make}/{model}",
                        new {controller = "Cars", action = "Index"});

тогда ваши actionResults могут выглядеть так:

public ActionResult Index(string make, string model)
    {
        //logic here to get where make and model

        return View();
    }

Я думаю, что это покрывает

0 голосов
/ 10 сентября 2009

Вместо этого я рекомендую использовать:

domain/m/<manufacturer>/<action>

Где 'm' - контроллер производителя. Это позволит вам использовать один и тот же контроллер для всех ваших расширений и избавит вас от головной боли в будущем, особенно при добавлении новых функций. Использование однобуквенного контроллера часто желательно, когда вы хотите сохранить свою первую переменную (в данном случае) в качестве первой точки интереса.

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