MVC Route Mapping
У меня есть веб-сайт, xyz.com, и пользователи настраивают учетные записи администратора, где у них есть другие пользователи, которые регистрируются под ними. Они называют свою учетную запись wisconsinsponsor
, Другой пользователь настраивает другую учетную запись с именем iowasponsor
, Итак, я хочу иметь возможность, чтобы пользователь мог просматривать xyz.com/wisconsinsponsor
а также xyz.com/iowasponsor
и перейдите к соответствующим настройкам, которые настроили эти пользователи.
Итак, после просмотра xyz.com/wisconsinsponsor
что позволит мне получить соответствующие настройки для Висконсинспонсора, на которого можно перейти xyz.com/wisconsinsponsor/{controller}/{method}
,
Поэтому я добавил следующий код.
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
List<Sponsor> sponsors = new SponsorContext().Sponsors.ToList();
foreach (Sponsor sponsor in sponsors)
{
// ALL THE PROPERTIES:
// rentalProperties/
routes.MapRoute(
name: sponsor.SponsorName,
url: sponsor.SponsorName + "{controller}/{action}/{id}",
defaults: new
{
controller = "Home",
action = "Index",
id = sponsor.SponsorId
}
);
}
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new {
controller = "Home",
action = "Index",
id = UrlParameter.Optional }
);
}
Таким образом, главная цель заключается в том, чтобы без входа в систему я мог получить информацию, относящуюся к каждому "спонсору", а затем просто общую информацию, если пользователь заходит на "xyz.com" без указания спонсора. Приведенное ниже работает для точки входа на домашнюю страницу, но затем, когда я перехожу к логину или любому другому представлению, я получаю, например, "xyz.com/[my первая запись спонсора в базе данных]/admin/login" вместо 'xyz.com/admin/login. Почему навигация не попадает на маршрут по умолчанию?
1 ответ
Измените свой маршрут, чтобы просто включить спонсора, не создавайте индивидуальные маршруты для каждого спонсора, вот где маршрутизация становится настолько мощной
routes.MapRoute(
name: null, //routes names must be unique, but you can have multiple named null (go figure)
url: "{sponsor}/{controller}/{action}/{id}",
defaults: new
{
sponsor = "defaultSponsor", //or whatever you want the default to be
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}
);
Затем украсьте каждый из ваших методов действия аргументом спонсора.
public ActionResult Index(string sponsor, int id) { }
Если перечитать ваш вопрос, это не поможет в случае отсутствия спонсора, если только ваш "defaultSponsor" на самом деле не спонсор, а предоставленная вами общая информация. Поэтому, когда спонсор не передается в адресной строке в маршрутизацию, вы видите 'defaultSponsor' или пустую строку и затем можете обработать соответствующим образом
Еще одна причина для обработки этого способа - RegisterRoutes вызывается только при запуске приложения, поэтому, если они были добавлены динамически во время работы приложения, они будут недопустимыми маршрутами, пока приложение не будет перезапущено. Делая это аргументом, они также будут работать динамически.