Используйте настраиваемый обработчик маршрута с маршрутизацией атрибутов MVC5.

Используя библиотеку AttributeRouting, я смог настроить маршрутизацию атрибутов для использования пользовательского маршрута. обработчик (наследует MvcRouteHandler):

routes.MapAttributeRoutes(cfg =>
    {
        cfg.UseRouteHandler(() => new MultiCultureMvcRouteHandler());
    }
);

Также до MVC5 можно было изменить обработчик маршрута любого существующего маршрута:

(routes["myroute"] as Route).RouteHandler = new MyCustomRouteHandler();

В MVC5, использующем маршрутизацию атрибутов, коллекция маршрутов содержит внутренние классы (например, RouteCollectionRoute), и кажется невозможным изменить свойство маршрута RouteHandler.

Как я могу изменить обработчик маршрута по умолчанию, используемый при работе с маршрутизацией атрибутов в MVC5.1?


person marapet    schedule 13.03.2014    source источник
comment
Вы имеете в виду ограничения маршрута?   -  person Steve Andrews    schedule 24.03.2014
comment
@SteveAndrews Нет, этот вопрос касается изменения RouteHandler. Но похоже, что это невозможно, по крайней мере, с маршрутизацией атрибутов в MVC5.1 :(   -  person marapet    schedule 24.03.2014
comment
Да, RouteHandler определенно можно изменить, похоже, что эту библиотеку просто нужно обновить.   -  person JuhaKangas    schedule 28.03.2014
comment
@JuhaKangas Если вы можете изменить обработчик маршрута, созданного с помощью маршрутизации атрибутов в MVC 5.1 (не отличная библиотека AttributeRouting, существовавшая задолго до MVC5), добавьте ответ на вопрос и покажите мне .   -  person marapet    schedule 28.03.2014
comment
Хорошо, извините, я немного ошибся. Я дал ответ для вас, я надеюсь, что это поможет.   -  person JuhaKangas    schedule 28.03.2014


Ответы (1)


Создайте свой собственный RouteAttribute.

Ознакомьтесь с документацией здесь: http://msdn.microsoft.com/en-us/library/system.web.mvc.routeattribute(v=vs.118).aspx

Реализуйте эти интерфейсы, и в методе CreateRoute вы можете выбрать обработчик маршрута для объекта RouteEntry.

Я не пробовал, но что-то вроде приведенного ниже, вам нужно проделать еще немного работы, но это должно поставить вас на правильный путь.

public class MyRouteAttribute : Attribute, IDirectRouteFactory, IRouteInfoProvider
{
    public RouteEntry CreateRoute(DirectRouteFactoryContext context)
    {
        return new RouteEntry("Test", new Route("Url", new CustomRouteHandler()));
    }

    public string Name
    {
        get { throw new NotImplementedException(); }
    }

    public string Template
    {
        get { throw new NotImplementedException(); }
    }
}
person JuhaKangas    schedule 28.03.2014
comment
Кстати, MapMvcAttributeRoutes() автоматически сопоставит ваш пользовательский атрибут маршрута при использовании этих интерфейсов. - person JuhaKangas; 28.03.2014
comment
Но это означало бы не только повсеместное использование пользовательского атрибута, но и повторную реализацию всего, что делает DirectRouteFactoryContext. Похоже, все стало еще сложнее ;) - person marapet; 28.03.2014
comment
Я могу только согласиться с вами, я покупаю необходимость использовать настраиваемый атрибут, но повторная реализация CreateRoute не совсем хороша. Было бы неплохо иметь наследуемый атрибут маршрута (сейчас он запечатан), который позволил бы установить обработчик маршрута. Но да, это единственный вариант, который я смог найти прямо сейчас. - person JuhaKangas; 29.03.2014