.NET MVC2 пользовательские маршруты подстраниц - PullRequest
0 голосов
/ 01 сентября 2010

При поиске я наткнулся на ASP.NET MVC маршрутизация страниц / подстраниц , и подстановочный знак был чем-то вроде спасения жизни, но представил новую проблему.

Рассмотрите следующие маршруты, если хотите. Здесь цель состоит в том, чтобы индекс (http://www.domain.com) использовал маршрут по умолчанию и [домен] / page использовал маршрут Content . StrSlug - это подстановочный знак потому что я планирую разделить слаг для использования на подстраницах. [домен] страница / подстраница (подстраница будет текущим слагом). Поскольку это подстановочный знак, кажется, что [домен] совпадает с Содержание Маршрут.

Что будет правильным для этого?

// Global.asx.cs  
routes.MapRoute(
        "Content", // Route name
        "{*strSlug}", // URL with parameters
        new { controller = "Home", action = "SiteContent", strSlug = UrlParameter.Optional } // Parameter defaults
    );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}", // URL with parameters
        new { controller = "Home", action = "Index" } // Parameter defaults
    );

    // HomeController.cs
    // Not the best code, feel free to improve.
    public ActionResult SiteContent(string strSlug)
    {
        string[] strSlug_arr = strSlug.Split("/".ToCharArray());
        strSlug = strSlug_arr[(strSlug_arr.Length-1)];

        SiteContent data = DB.SiteContents.Single(c => c.Slug == strSlug);
        return View(data);
    }

EDIT: Проводя дальнейшие исследования, я надеялся использовать что-то вроде этого.

public ActionResult Index()
{
    SiteContent data = DB.SiteContents.Single(c => c.Slug == "home-page");
    return View(data);
}

public ActionResult SiteContent(string strSlug)
{
    if (strSlug == null)
    {
        return RedirectToAction("Index");
    }
    else
    {
        string[] strSlug_arr = strSlug.Split("/".ToCharArray());
        strSlug = strSlug_arr[(strSlug_arr.Length - 1)];

        SiteContent data = DB.SiteContents.Single(c => c.Slug == strSlug);
        return View(data);
    }
}

.. но по какой-то причине это приводит к циклу перенаправления.

РЕДАКТИРОВАТЬ # 2 Так что это решение вроде как, может, работает? Я еще не видел обратной стороны.

    // Global.asx.cs
    routes.MapRoute(
        "Content", // Route name
        "{strSlug}/{*strSubSlug}", // URL with parameters
        new { controller = "Home", action = "SiteContent", strSubSlug = UrlParameter.Optional } // Parameter defaults
    );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/", // URL with parameters
        new { controller = "Home", action = "Index" } // Parameter defaults
    );


    // HomeController.cs
    public ActionResult Index()
    {
        SiteContent data = DB.SiteContents.Single(c => c.Slug == "home-page");
        return View(data);
    }

    public ActionResult SiteContent(string strSlug, string strSubSlug)
    {
        /*
        string[] strSlug_arr = strSlug.Split("/".ToCharArray());
        strSlug = strSlug_arr[(strSlug_arr.Length - 1)];
         */

        if (strSubSlug != null)
        {
            string[] strSubSlug_arr = strSubSlug.Split("/".ToCharArray());
            strSlug = strSubSlug_arr[(strSubSlug_arr.Length - 1)];
        }

        SiteContent data = DB.SiteContents.Single(c => c.Slug == strSlug);
        return View(data);
    }

Итак, [домен] / слаг работает .. и все, что после этого анализирует последний слаг .. так что [домен] слаг / sub / sub / sub / content будет захватывать страницу, соответствующую слагу содержимого.

1 Ответ

1 голос
/ 01 сентября 2010

Если подстановочный знак указать в качестве первого параметра в URL-маршруте, каждый запрос будет перенаправлен на маршрут Content.Чтобы достичь того, чего вы хотите, вы можете использовать этот маршрут.

route.MapRoute(
    "Content",
    "Page/{*strSlug}",
    new { controller = "Home", action = "SiteContent", strSlug = UrlParameter.Optional }
);

При доступе к www.domain.com будет использоваться маршрут по умолчанию и с www.domain.com /Страница будет использовать маршрут Content, например, www.domain.com / Page / subpage .

www.domain.com/Page/subpage1/subpage2

Приведенный выше URL даст вашему параметру strSlug вашего SiteContent ActionResult значение subpage1/subpage2.Затем вы можете проанализировать ваш strSlug, чтобы получить ваш контент.

...