asp.NET: пути MVC неизвестной длины - PullRequest
3 голосов
/ 26 августа 2009

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

Мой маршрут по умолчанию работает так:

routes.MapRoute(
  "Default",
  "{level1}/{level2}/{level3}",
  new { controller = "Page", action = "Index", level1 = "home", level2 = "", level3 = "" }
      );

Но это имеет фиксированную ширину, она будет принимать только до 3 уровней. Кроме того, я хотел бы управлять действиями, добавляемыми к пути, такими как «изменить» и «удалить». Это возможно?

company/about/who_we_are/staff -> Controller: Page, Action: Index, Parms: company/about/who_we_are/staff
company/about/who_we_are/staff/edit  -> Controller: Page, Action: Edit, Parms: company/about/who_we_are/staff
company/edit  -> Controller: Page, Action: Edit, Parms: company

Или есть лучший способ смоделировать это? Все пути к страницам находятся в базе данных, поэтому они динамически изменяются.

Ответы [ 3 ]

5 голосов
/ 26 августа 2009

Вы можете использовать маршрутный символ:

"{*data}"

взгляните на это SO: Пользовательский обработчик маршрута / ограничение ASP.net MVC


простое возможное решение:

(не проверено, но ...)

Маршрут:

routes.Add(new Route
                           (
                           "{*data}",
                           new RouteValueDictionary(new {controller = "Page", action = "Index", data = ""}),
                           new PageRouteHandler()
                           )
                );

Обработчик будет выглядеть так:

public class PageRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new PageHttpHandler(requestContext);
    }
}

class PageHttpHandler : MvcHandler
{
    public PageHttpHandler(RequestContext requestContext)
        : base(requestContext)
    {
    }

    protected override void ProcessRequest(HttpContextBase httpContext)
    {
        IController controller = new PageController();

        ((Controller)controller).ActionInvoker = new PageActionInvoker();

        controller.Execute(RequestContext);
    }
}

class PageActionInvoker : ControllerActionInvoker
{
    protected override ActionResult InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary<string, object> parameters)
    {
        string data = controllerContext.RouteData.GetRequiredString("data");
        string[] tokens = data.Split('/');


        int lenght = tokens.Length;

        if (lenght == 0)                   
            return new NotFoundResult();

        if (tokens[tokens.Length - 1] == "edit")
        {
            parameters["action"] = "edit";
            lenght--;
        }

        for (int i = 0; i < length; i++)
            parameters["level" + (i + 1).ToString()] = tokens[i];

        return base.InvokeActionMethod(controllerContext, actionDescriptor, parameters);
    }
}
2 голосов
/ 15 марта 2011

Жадный сегмент где-нибудь в URL, возможно? Это да!

Я написал GreedyRoute класс, который поддерживает жадный (перехватывать все) сегмент в любом месте URL. Это было давно, так как вы нуждались в этом, но это может быть полезно для других в будущем.

Поддерживает любой из следующих шаблонов:

  • {segment}/{segment}/{*greedy} - это уже поддерживается по умолчанию Route class
  • {segment}/{*greedy}/{segment} - жадный посередине
  • {*greedy}/{segment}/{segment} - жадный в начале

Вы можете прочитать все подробности в моем блоге и получить код.

1 голос
/ 26 августа 2009

Насколько я знаю, вы можете использовать регулярные выражения для выражения того, как могут выглядеть маршруты (см. Нижний раздел кода здесь ). При этом должна быть возможность создать строку регулярных выражений, которая может занимать неопределенное количество подразделов («forward-slashe и text / number-groups»). Затем вы можете проанализировать строку URL в вашем приложении и получить соответствующий раздел.

Я, однако, не способен написать эту строку регулярных выражений самостоятельно, не тратя часы, поэтому, возможно, кто-то другой может помочь вам там. : -)

...