2011-01-06 7 views
1

Как я могу получить довольно URLs как локальный хост: 8888/Новости/Пример-поста вместо локального хоста: 8888/Home/Деталь/2Довольно URL ASP.NET MVC

Моего HomeController имеет следующий для метода Details

public ActionResult Details(int id) 
{ 
    var ArticleToView = (from m in _db.ArticleSet where m.storyId == id select m).First(); 

    return View(ArticleToView); 

ответ

9

Поскольку система маршрутизации ASP.NET несколько сложна, существует множество способов выполнить то, что вы описываете.

Прежде всего, Вы просто хотите иметь красивый URL-адрес для метода «Детали»? Если это так, вы можете подумать о переименовании HomeController в NewsController или перемещении метода Details в новый класс NewsController, который автоматически сформирует часть URL-адреса /News. Если вам не нужна часть /Details, вы можете переименовать свой метод Details Index, так как он будет автоматически вызван /News. Наконец, вам нужно изменить свой параметр int id на string name.

Если вам нужны многие настраиваемые URL-адреса, вам нужно будет определить свои собственные маршруты. Вот два способа сделать это:

1. Самым простым способом я нашел в использующих ASP.NET MVC Attribute-Based Route Mapper. Таким образом, все, что вам нужно сделать, это добавить атрибут для каждого метода, для которого вы хотите иметь хороший URL, и указать, какой URL вы хотите.

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

[Url("News/{name}")] 
public ActionResult Details(string name) 
{ 
    var ArticleToView = (from m in _db.ArticleSet where m.storyName == name select m).First(); 

    return View(ArticleToView); 
} 

2. В качестве альтернативы, вы можете определить пользовательские маршруты вручную в Global.asax.cs. В вашем методе RegisterRoutes, вы можете добавить следующее в середине:

routes.MapRoute(
       "NewsDetails",             
       "News/{name}",         
       new { controller = "News", action = "Details", name = "" } 
      ); 
+0

Не существует встроенного способа сделать это, не требуя дополнительных надстроек и т. Д. – Cameron

+0

@Cameron Конечно, есть: y ou может также определять маршруты в Global.asax так же легко, но я обнаружил, что использование чего-то вроде того, что я связал, конечно, стоит дополнительной библиотеки DLL. –

+0

Как насчет того, чтобы просто изменить Home to News для всех методов в HomeController? – Cameron

1

Что я делаю на своих сайтах, что я проверить URL против либо названия страницы или страниц заглушек в тех случаях, когда заголовки страниц могут иметь одноименное имя, например, если у вас есть сайт, на котором размещается «Изображение недели», вы можете использовать заглушку вместо названия, так как у вас будут мультипликаторы с одинаковым именем.

URL-адреса выглядеть следующим образом: http://mySite.com/Page/Verse-of-the-Week

Global.asax содержит следующее:

routes.MapRoute("Pages", "{controller}/{pageID}", new { controller = "Page", action = "Index", pageID = "Home" }); 

PageController это:

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Index(string pageID) 
    { 
     if (pageID == null) 
     { 
      pageID = pageRepository.HomeOrLowest(); 
     } 
     var p = pageRepository.ByStub(pageID); 
     if (p == null) { return RedirectToAction("NotFound", "Error"); } 
     return View(p); 
    } 

Репозиторий выглядит следующим образом:

private static Func<mvCmsContext, string, Page> _byStub = 
     CompiledQuery.Compile((mvCmsContext context, string pageTitle) => 
      (from p in context.Pages 
      where p.pageTitle.Replace(" ", "-") == pageTitle 
      select p).SingleOrDefault()); 
    public Page ByStub(string pageTitle) 
    { 
     return _byStub(context, pageTitle); 
    } 

Надеюсь, что это поможет.

Изменить, чтобы добавить дубликат обработки:

private static Func<mvCmsContext, string, int> _pageExists = 
     CompiledQuery.Compile((mvCmsContext context, string pageTitle) => 
      (from p in context.Pages 
      where p.pageTitle.Replace(" ", "-") == pageTitle 
      select p).Count()); 
    public bool PageExists(string pageTitle) 
    { 
     return Convert.ToBoolean(_pageExists(context, pageTitle)); 
    } 

Подтверждает так:

 IValidationErrors errors = new ValidationErrors(); 
     if (CreateOrEdit == "Create") 
     { 
      if (pageRepository.PageExists(model.pageTitle) && !String.IsNullOrEmpty(model.pageTitle)) 
       errors.Add("pageTitle", "A page with this title already exists. Please edit it and try again."); 
     } 
+0

mark - можете ли вы подробнее объяснить, как вы смягчаете дублирование имен страниц, пожалуйста. я получаю суть того, что вы говорите, но неясно, как вы полностью удаляете появление дубликатов (вы добавляете идентификатор страницы?). спасибо .. –

+0

Это зависит от сайта. На моем личном сайте он выдает ValidationErrors и запрашивает переименование страницы. Вы можете просто добавить (или добавить) число или DateTime, а затем запустить его снова и при необходимости увеличивать. Отредактированное сообщение, чтобы включить проверку PageExists. – mark123