ASP.NET MVC: путь к URL - PullRequest
4 голосов
/ 11 мая 2010

Какой самый простой способ получить URL (относительный или абсолютный) для маршрута в MVC? Я видел этот код здесь на SO, но он кажется немного многословным и не перечисляет RouteTable.

Пример:

List<string> urlList = new List<string>();
urlList.Add(GetUrl(new { controller = "Help", action = "Edit" }));
urlList.Add(GetUrl(new { controller = "Help", action = "Create" }));
urlList.Add(GetUrl(new { controller = "About", action = "Company" }));
urlList.Add(GetUrl(new { controller = "About", action = "Management" }));

С:

protected string GetUrl(object routeValues)
{
    RouteValueDictionary values = new RouteValueDictionary(routeValues);
    RequestContext context = new RequestContext(HttpContext, RouteData);

    string url = RouteTable.Routes.GetVirtualPath(context, values).VirtualPath;

    return new Uri(Request.Url, url).AbsoluteUri;
}

Какой лучший способ проверить RouteTable и получить URL для данного контроллера и действия?

Ответы [ 2 ]

7 голосов
/ 11 мая 2010

Используйте класс UrlHelper: http://msdn.microsoft.com/en-us/library/system.web.mvc.urlhelper.aspx

Вы должны иметь возможность использовать его через объект Url в вашем контроллере. Чтобы отобразить действие, используйте метод Action: Url.Action("actionName","controllerName");. Полный список перегрузок для метода Action приведен здесь: http://msdn.microsoft.com/en-us/library/system.web.mvc.urlhelper.action.aspx

чтобы ваш код выглядел так:

        List<string> urlList = new List<string>();
        urlList.Add(Url.Action("Edit", "Help"));
        urlList.Add(Url.Action("Create", "Help"));
        urlList.Add(Url.Action("Company", "About"));
        urlList.Add(Url.Action("Management", "About"));

РЕДАКТИРОВАТЬ: Судя по вашему новому ответу, вы пытаетесь создать карту сайта.

Взгляните на этот проект Codeplex: http://mvcsitemap.codeplex.com/. Я сам не использовал его, но он выглядит довольно солидно.

0 голосов
/ 11 мая 2010

Как насчет этого (в контроллере):

    public IEnumerable<SiteMapEntry> SiteMapEntries
    {
        get
        {
            var entries = new List<SiteMapEntry>();

            foreach (var route in this.Routes)
            {
                entries.Add(new SiteMapEntry
                (
                    this.Url.RouteUrl(route.Defaults),
                    SiteMapEntry.ChangeFrequency.Weekly,
                    DateTime.Now,
                    1F));
            }

            return entries;
        }
    }

Где контроллер имеет член:

public IEnumerable<Route> Routes

Обратите внимание:

this.Url.RouteUrl(route.Defaults)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...