2010-05-11 18 views
4

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

Пример:

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 для данного контроллера и действия?

+0

Если вы в действии есть помощник UrlAction http://msdn.microsoft.com/en-us/library/system.web.mvc.urlhelper.action.aspx – R0MANARMY

ответ

0

Как об этом (в контроллере):

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) 
+0

Точно так же, как asid е. Рекомендуется, чтобы вы фактически отредактировали исходный вопрос, а не опубликовали новый ответ (если это не фактический ответ) –

+0

GREAT! Это то, что я искал. Спасибо! –

7

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

Вы должны быть в состоянии использовать его с помощью Url объекта в контроллере. Чтобы перейти к действию, используйте метод Action: Url.Action("actionName","controllerName");. Полный список перегрузок для метода Action здесь:

так что ваш код будет выглядеть следующим образом:

 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")); 

EDIT: Кажется, от нового ответа, который вы пытаетесь создать карту сайта ,

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

Смежные вопросы