asp.net mvc динамическая / относительная маршрутизация - PullRequest
3 голосов
/ 20 января 2010

Я занимаюсь разработкой сайта, который имеет модульную структуру. Каждый сегмент URL представляет элемент контента. Например, URL: www.mysite.com/blogs/programming/2010/01/

Корневой элемент - это «блоги» типа «область». У него есть дочерний элемент «программирование» типа «блог».

Теперь от URL осталось «2010/01». Последним действительным (маршрутизируемым) элементом 'программирование' был блог, поэтому мне нужно сопоставить '2010/01' с действием

BlogController.Date (int blogid, int year, int? Month, int? Day)

Каждый контроллер поступает из модуля (отдельного dll), который регистрирует некоторые типы элементов (типы блогов регистрируют «blog» (маршрутизируемый) и «post» (не маршрутизируемый). «Blog» может иметь дочерние элементы типа «post») , Когда последний действительный (маршрутизируемый) элемент URL обнаружен, логика знает, какую сборку и контроллер искать. Теперь мне нужен способ вызвать правильное действие с правильными параметрами.

Некоторые маршруты для элемента типа 'блог'

{year}/
{year}/{month}
{year}/{month}/{day}
feed/
category/{category-name}/
tag/{tag-name}/
search/{*phrase}
{*post-name}

Любые предложения, что бы сделать простой способ маршрутизации?

1 Ответ

1 голос
/ 06 марта 2011

Чтобы решить проблему с сигнатурой параметра действия, я лично создал бы новый класс Model "BlogModel" и использовал бы только этот параметр в качестве единственного параметра. Таким образом, вы получите согласованную сигнатуру параметра действия. Однако это потребует немного больше работы, так как вам нужно будет создать собственный объект ModelBinder "BlogModelBinder" и зарегистрировать его в ModelBinderFactory (или в MVC3 DependencyResolver). В «BlogModelBinder» вы просто просматриваете параметры и значения RouteData и привязываете его к соответствующему полю в вашей «BlogModel».

Исходя из моего личного опыта, я не думаю, что есть простой способ зарегистрировать ваши маршруты: вам все равно придется индивидуально регистрировать URL-адреса маршрутов для конкретного действия. Если у кого-то нет эффективного способа регистрации URL-адресов маршрутов, вы можете утешиться, зная, что мы все должны запачкать руки сантехническим кодом.

...