2015-06-10 2 views
1

мне удалось получить мой проект MVC представить список новостей в SEO дружественной манере:MVC маршрутизации Новости Страницы

/Новости/- представить список

/Новости/статьи новостей/ID/Новости-пункт-название - индивидуальная новость

То, что я действительно хотел бы это:

Новости/ID/Новости-пункт-синица le

Точно, как Stackoverflow представляет свои вопросы.

Однако, похоже, я не знаю, как сделать маршрутизацию, чтобы различать два действия с тем же именем действия контроллера (Index).

Любые предложения будут оценены.

EDIT:

Вот мои маршруты конфигурации:

routes.MapRoute(
    "News", 
    "News/NewsItem/{newsId}/{newsTitle}", 
    new { controller = "News", action = "NewsItem", newsTitle = UrlParameter.Optional }, 
    new { newsId = @"\d+" } 
); 

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "SkipHire", action = "Index", id = UrlParameter.Optional } 
); 

EDIT 2:

Это то, что я изменен все, чтобы:

Маршрут

routes.MapRoute(
    "News", 
    "{controller}/{id}/{newsTitle}", 
    new { action = "NewsItem", newsTitle = UrlParameter.Optional } 
); 

Контроллер

public class NewsController : Controller 
{ 
    public ActionResult Index() 
    { 
     var q = _ctx.tblNews.OrderBy(x => x.newsCreateDate) 
        .Where(x => x.WebsiteID == 2).ToList(); 
     return View(q); 
    } 

    public ActionResult NewsItem(int newsId, string newsTitle) 
    { 
      return View(); 
    } 
} 

View - Index (сегмент)

<table> 
    @foreach (var x in Model) 
    { 
     <tr> 
      <td>@Html.ActionLink(x.newsTitle, "NewsItem", new { newsId = x.newsID, newsTitle = x.newsTitle.ToSeoUrl() }) 
      </td> 
     </tr> 
    } 
</table> 

ActionLink производит: Новости/статьи новостей NewSID = 3 & newsTitle = мой-новости-пункт

Я хочу: Новости/3?/my-news-item

+0

Вы можете показать свою текущую конфигурацию маршрута? – TSmith

ответ

2

Один из способов сделать это - ввести дополнительный маршрут в конфигурацию маршрута

RouteConfig.cs:

  routes.MapRoute(
      name: "News_seo_friendly", 
      url: "{controller}/{id}/{seo}", 
      defaults: new { action = "NewsItem", seo = UrlParameter.Optional } 
     ); 

* Обратите внимание, что значение действия в этом маршруте. Вам понадобится соответствующий метод действий на этом контроллере. Кроме того, поскольку этот маршрут является более специфичным он идет над существующим, более общий маршрут (ы)

альт RouteConfig.cs, что может быть безопаснее:

  routes.MapRoute(
      name: "News_seo_friendly", 
      url: "News/{id}/{seo}", 
      defaults: new { controller = "News", action = "NewsItem", seo = UrlParameter.Optional } 
     ); 

NewsController:

public ActionResult NewsItem(string id) 
    { 
     return View(); 
    } 

Еще один способ сделать это - сделать «Новости» своей областью внутри проекта. Это дает вам возможность изолировать маршруты, если ваше приложение больше, и гибкость для имени вашего контроллера.

Отредактирован после того, как обратная связь Хотела обратить внимание на тот факт, что имя параметра по методу контроллера статьи новостей() должно соответствовать тому, что объявляется в настройках маршрута. В приведенном выше сценарии URL-адрес: {{controller}/{id}/{seo} "
должен соответствовать имени параметра в NewsItem (строка id) ... или наоборот.

+0

Извините, я не могу заставить это работать правильно. Данные ссылки идут на запрос: News/NewsItem? NewsId = 3 & newsTitle = my-news-item – ComfortablyNumb

+0

Не стоит беспокоиться. Можете ли вы показать, как выглядит ваша ссылка на html? – TSmith

+0

Я отредактировал вопрос, чтобы показать мои поправки. Благодарю. – ComfortablyNumb

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