Необязательные параметры в маршрутизации, заканчивающиеся параметром подкачки - PullRequest
0 голосов
/ 17 февраля 2012

Я создаю блог, который содержит 3 разных просмотра. - Обзор - Сообщение подробно - Отфильтрованный обзор

Отфильтрованный обзор основан на блог-постах, которые содержат определенный тег, чтобы сделать URL-адрес красивым. Мне бы хотелось, чтобы в нем можно было добавлять необязательные параметры, подобные следующим:

mydomain.com/blog/<tagname>/<page>
mydomain.com/blog/<tagname1>/<tagname2>/<page>
mydomain.com/blog/<tagname1>/<tagname2>/<tagname3>/<page>

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

Заранее спасибо, DerDee

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

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

public class BlogRoute : Route
{
    public BlogRoute()
        : base(
            "blog/{*info}", 
            new RouteValueDictionary(new 
            { 
                controller = "blog", 
                action = "index" 
            }),
            new MvcRouteHandler()
        )
    { 
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var rd = base.GetRouteData(httpContext);
        if (rd == null)
        {
            return null;
        }

        var info = rd.Values["info"] as string;
        if (string.IsNullOrEmpty(info))
        {
            return rd;
        }

        var parts = info.Split('/');
        if (parts.Length < 1)
        {
            return rd;
        }

        for (int i = 0; i < parts.Length; i++)
        {
            if (i == parts.Length - 1)
            {
                int page;
                if (int.TryParse(parts[i], out page))
                {
                    rd.Values["page"] = page;
                }
            }

            if (!rd.Values.ContainsKey("page"))
            {
                rd.Values[string.Format("tags[{0}]", i)] = parts[i];
            }
        }

        return rd;
    }
}

, который будет зарегистрирован в Global.asax:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.Add("BlogRoute", new BlogRoute());

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

, и тогда у вас может быть BlogController:

public class BlogController : Controller
{
    public ActionResult Index(string[] tags, int? page)
    {
        ...
    }
}
1 голос
/ 17 февраля 2012

У вас не может быть необязательных параметров, предшествующих обязательным параметрам в MVC.Одним из решений было бы поместить параметр подкачки перед параметром тегов:

mydomain.com/blog/<page>/<tagname>
mydomain.com/blog/<page>/<tagname1>/<tagname2>
mydomain.com/blog/<page>/<tagname1>/<tagname2>/<tagname3>

Затем вы можете задать значение по умолчанию для параметра страницы вашего маршрута:

MapRoute(null, "blog/{page}/{*tagNames}", 
    new { controller = "Blogs", action = "ByPageAndTags", page = 1 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...