Здравствуйте, alvas, Вы писали:
A>Как сделать ссылки первого уровня типа localhost/About и localhost/Faq.
A>Для этого делаю виды Views/About/Index.aspx и Views/Faq/Index.aspx + по контроллеру Controllers/AboutController.cs и Controllers/FaqController.cs A>Хотелось иметь один контроллер типа Controllers/DefaultController.cs и Views/About.aspx и Views/Faq.aspx
A>Как это настроить?
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// это надо воткнуть до маршрута по умолчаниюvar firstLevelActions = new[] { "Faq", "About" };
foreach (var fla in firstLevelActions)
{
routes.MapRoute(
"FirstLevelRoute" + fla, // Route name
fla, // URL with parametersnew {controller = "Default", action = fla} // Parameter defaults
);
}
// end
routes.MapRoute(
"Default", // Route name"{controller}/{action}/{id}", // URL with parametersnew { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
Только вьюхи всетаки придется положить во Views/Default или Views/Shared. Или настраивать view engine, это я не буду за тебя делать, ибо блажь, имхо.
Как сделать ссылки первого уровня типа localhost/About и localhost/Faq.
Для этого делаю виды Views/About/Index.aspx и Views/Faq/Index.aspx + по контроллеру Controllers/AboutController.cs и Controllers/FaqController.cs
Хотелось иметь один контроллер типа Controllers/DefaultController.cs и Views/About.aspx и Views/Faq.aspx
Здравствуйте, alvas, Вы писали:
A>Как сделать ссылки первого уровня типа localhost/About и localhost/Faq.
A>Для этого делаю виды Views/About/Index.aspx и Views/Faq/Index.aspx + по контроллеру Controllers/AboutController.cs и Controllers/FaqController.cs A>Хотелось иметь один контроллер типа Controllers/DefaultController.cs и Views/About.aspx и Views/Faq.aspx
A>Как это настроить?
Нужно задать умолчания.
В Global.asax.cs у меня написано.
Z> public static void RegisterRoutes(RouteCollection routes)
Z> {
Z> routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
Z> // это надо воткнуть до маршрута по умолчанию
Z> var firstLevelActions = new[] { "Faq", "About" };
Z> foreach (var fla in firstLevelActions)
Z> {
Z> routes.MapRoute(
Z> "FirstLevelRoute" + fla, // Route name
Z> fla, // URL with parameters
Z> new {controller = "Default", action = fla} // Parameter defaults
Z> );
Z> }
Z> // end
Z> routes.MapRoute(
Z> "Default", // Route name
Z> "{controller}/{action}/{id}", // URL with parameters
Z> new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
Z> );
Z> }
Z>
Z>Только вьюхи всетаки придется положить во Views/Default или Views/Shared. Или настраивать view engine, это я не буду за тебя делать, ибо блажь, имхо.
Какие есть идеи по организации более сложного роутинга?
Например.
Есть несколько вариантов сайта — "html", "silverlight", "mobile", "touch".
Соответственно для каждого из них есть собственный контроллер и набор соответствующих view.
Набор страниц для каждой версии примерно одинаков — "index", "profile", "messages" и т.д.
Таким образом у нас есть пути:
— site.com/html/index
— site.com/html/profile
— site.com/mobile/index
— site.com/mobile/profile
— ...
Охота, чтобы при заходе на страницы типа "site.com/index", "site.com/profile" для пользователя определялась подходящий ему вариант сайта, записывалась в Cookie и он продолжал с ним работать.
Так же у пользователя есть возможность сменить текущий вариант.
Хочется каким-то образом расширить логику роутинга, чтобы при заходе на страницы без указания варианта сайта, роутер по кукам отправлял к нужному контроллеру.
Пока приходит на ум только такой вариант — создать контроллер "RouteController", установить его для корневых страниц, в нем проверять куки и делать редирект к нужному контроллеру.
Здравствуйте, ankstoo, Вы писали:
A>Охота, чтобы при заходе на страницы типа "site.com/index", "site.com/profile" для пользователя определялась подходящий ему вариант сайта, записывалась в Cookie и он продолжал с ним работать. A>Так же у пользователя есть возможность сменить текущий вариант.
A>Хочется каким-то образом расширить логику роутинга, чтобы при заходе на страницы без указания варианта сайта, роутер по кукам отправлял к нужному контроллеру.
A>Пока приходит на ум только такой вариант — создать контроллер "RouteController", установить его для корневых страниц, в нем проверять куки и делать редирект к нужному контроллеру.
A>А хочется что-то типа A>
A> RouteBuilder.Current.SetRouteFactory(MyRouteFactory);
A>
A>Такой возможности я не нашел, может не там искал?
Попробую ткнуть пальцем в небо, а области (areas) тут не помогут? Они предназначены для разделения чрезмерно большого проекта на несколько групп по функциональному признаку, но, может, подойдет?
Здравствуйте, SE, Вы писали:
SE>Попробую ткнуть пальцем в небо, а области (areas) тут не помогут? Они предназначены для разделения чрезмерно большого проекта на несколько групп по функциональному признаку, но, может, подойдет?
Areas — это просто еще один уровень группировки элементов сайта. Проблему они не решат.
Все равно нужно писать собственный контроллер в default area, откуда перенаправлять в нужную area.
Здравствуйте, alvas, Вы писали:
A>А может лучше просто детектить UserAgent и отдавать версию сайта, оптимизированную под конкретное устройство не меняя ссылок?
Логика UI для разных вариантов сайта различается. Поэтому для каждой из них необходим свой контроллер. Через что будет происходить переход между контроллерами — через redirect или через прямой вызов — не так важно.
Возможность указать вариант приложения в адресе нужна — чтобы можно было "ну и что что я с winmobile сижу — хочу полную версию сайта".
А при заходе без указания варианта — конечно проверка UserAgent или Cookie.
Здравствуйте, ankstoo, Вы писали:
A>>А может лучше просто детектить UserAgent и отдавать версию сайта, оптимизированную под конкретное устройство не меняя ссылок?
A>Логика UI для разных вариантов сайта различается. Поэтому для каждой из них необходим свой контроллер. Через что будет происходить переход между контроллерами — через redirect или через прямой вызов — не так важно.
A>Возможность указать вариант приложения в адресе нужна — чтобы можно было "ну и что что я с winmobile сижу — хочу полную версию сайта". A>А при заходе без указания варианта — конечно проверка UserAgent или Cookie.
Если я правильно все понимаю — вам нужно детектить и перенаправлять — предлагаю
1. написать свой ActionFilter
2. или использовать свой базовый контролер и от него наследоваться.
Здравствуйте, alvas, Вы писали:
A>Если я правильно все понимаю — вам нужно детектить и перенаправлять — предлагаю A>1. написать свой ActionFilter
Не очень хорошо — как я понимаю нужно писать атрибут моего ActionFilter перед каждым Action в каждом контроллере.
A>2. или использовать свой базовый контролер и от него наследоваться.
Пока самый приемлемый вариант.
Но хочется разделения ответственности — контроллер управляет поведением UI, а роутингом занимается роутер
A>>Если я правильно все понимаю — вам нужно детектить и перенаправлять — предлагаю A>>1. написать свой ActionFilter A>Не очень хорошо — как я понимаю нужно писать атрибут моего ActionFilter перед каждым Action в каждом контроллере.
A>>2. или использовать свой базовый контролер и от него наследоваться. A>Пока самый приемлемый вариант. A>Но хочется разделения ответственности — контроллер управляет поведением UI, а роутингом занимается роутер
Можно совместить приятное с полезным, просто указав Inherited = true для вашего атрибута