Как я могу динамически добавить в ASP.NET MVC RouteTable? - PullRequest
4 голосов
/ 31 января 2011

На нашем сайте есть раздел, где люди могут зарегистрироваться и получить собственную страницу на сайте, которую мы хотим разместить по адресу ~ / pageSlug .Я попытался сделать это с правилом в Global.asax, но это нарушило фундаментальный маршрут по умолчанию, который позволяет ~ / Controller отображаться непосредственно в действие Index.Мне не разрешено помещать какие-либо разделители перед userSlug, поэтому ~ / p / pageSlug здесь не вариант.

Что касается добавления пользовательских страниц к маршрутам, я перебираю страницы в App_Start и явно добавляю их в RoutesTable.Это работает нормально, и у нас достаточно много обновлений AppPool, чтобы сделать это задачей раз в день.Тем не менее, у нас остается 24-часовой поворот, чтобы «оживить страницы» для наших пользователей, и я пытаюсь это решить.

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

RouteTable.Routes.Add(
    RouteTable.Routes.MapRoute(
        toAdd.UrlSlug + "Homepage", 
        toAdd.UrlSlug, 
        new { controller = "Controller", View = "View", urlSlug = toAdd.UrlSlug }
    )
);

, но это не сработало.Я не могу найти решение где-либо еще, и я уверен, что мой код ужасно наивен и выдает отсутствие понимания маршрутизации - пожалуйста, помогите!

Ответы [ 3 ]

4 голосов
/ 01 февраля 2011

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

public class UserPageConstraint : IRouteConstraint
{
    public static IList<string> UserPageNames = (Container.ResolveShared<IUserService>()).GetUserPageNames();

    bool _IsUserPage;
    public UserPageConstraint(bool IsUserPage)
    {
        _IsUserPage = IsUserPage;            
    }

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        if (_IsUserPage)
            return UserPageNames.Contains(values[parameterName].ToString().ToLower());
        else
            return !UserPageNames.Contains(values[parameterName].ToString().ToLower());
    }
}

Затем в Global.asax.cs, настроить маршрут для пользователей следующим образом:

routes.MapRoute("UserHome", "{userPage}", new { controller = "UserPageController", action = "Index" }, new { userPage = new UserPageConstraint(true) });

Для этого вышеупомянутого маршрута в действии 'index' UserPageController в качестве параметра будет использоваться userPage.

Для других маршрутов, относящихся к домашней странице userPage, мы можем соответствующим образом добавить маршруты.Например, маршрут страницы пользователя подробно может быть добавлен следующим образом:

routes.MapRoute("UserHome", "{userPage}/mydetails", new { controller = "UserPageController", action = "Details" }, new { userPage = new UserPageConstraint(true) });

Вы можете попробовать это и посмотреть.

2 голосов
/ 02 ноября 2015

Недавно я тоже это понял, вместо того, чтобы динамически добавлять маршруты, что, я не уверен, можно сделать без использования внешних библиотек, таких как Route Magic .Я уверен, что если вы правильно спроектируете свою архитектуру, Routing Constraint - это все, что вам может понадобиться.Поскольку мое приложение невелико, я использую только один реализованный контроллер и динамически создаю остальные (в настоящее время они экспериментальные, но они должны работать).

Рассмотрим следующие маршруты

routes.MapRoute(
  name: "ContactRequests_Operations",
  url: "ContactRequests-{operation}",
  defaults: new { controller = "Content", action = "Module_Direct", id =  "ContactRequests" , operation = "Get" }
  );

 routes.MapRoute(
    name: "Messages",
    url: "Messages",
    defaults: new { controller = "Content", action = "Direct", id ="Messages" }
);
0 голосов
/ 31 января 2011

Я не думаю, что вы можете добавить маршрут динамически.

Взгляните на этот вопрос, может быть, он поможет вам: ASP.NET MVC настраиваемая маршрутизация для поиска

...