2015-04-20 2 views
2

У меня есть приложение для ведения блогов, и пользователи могут создавать сообщения, я использовал фреймворк Entity для создания модели из базы данных. В сообщениях у меня есть запись для UrlSlug.отображать url slug вместо id в mvc

Однако, когда я проверить детали пост:

Контроллер:

public ActionResult Details(int id = 0) 
    { 
     Post post = db.Posts.Find(id); 
     if (post == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(post); 
    } 

Он возвращает URL с id в конце: http://localhost:52202/Post/Details/1

Я попытался возвращающегося пост. UrlSlug (выдает ошибку), а также меняет мой файл RouteConfig.cs для использования urlslug вместо id (который отображает urlslug, но он не может на странице из-за контроллера). Как я могу изменить это, так отображается urlslug вместо Post Table Id?

RouteConfig.cs

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

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

Вид:

@for (int i = 0; i < Model.Count(); i += 3) 
{ 
    <div class="row"> 
     @foreach (var item in Model.Skip(i).Take(3)) 
     { 
      <div class="col-md-4 portfolio-item"> 
       <a href="@Url.Action("Details", "Post", new { id = item.Id })"> 
        <img class="img-responsive" src="http://placehold.it/700x400" alt=""> 
       </a> 
       <h3> 
        <a href="@Url.Action("Details", "Post", new { id = item.Id })">@Html.DisplayFor(modelItem => item.Title)</a> 
       </h3> 

       <p>@Html.DisplayFor(modelItem => item.ShortDescription)</p> 

      </div> 
     } 

    </div> 
} 

@Html.PagedListPager(Model, page => Url.Action("Index", new { page, pageSize = Model.PageSize })) 

Редактировать

Вопрос я заметил на этой линии:

public ActionResult Details(string urlslug) 
    { 
     Post post = db.Posts.Find(urlslug); //find only finds an eitity with a given primary key, how can I change this to find the string urlslug 
+0

возможный дубликат [ASP. NET MVC: маршрутизация пользовательских слизней без влияния на производительность] (http://stackoverflow.com/questions/11494184/asp-net-mvc-routing-custom-slugs-without-affecting-performance) –

+0

проверить этот ответ http: // stackoverflow .com/a/11496379/2907017 –

ответ

3

Метод действия не определяет URL-адрес, он соответствует только запросу. Вам нужно распечатать слизняка:

@Url.Action("Details", "Post", new { slug = item.Slug }) 

Затем добавить к маршрутизации для поддержки структуры URL вы хотите:

routes.MapRoute(
    name: "PostWithSlug", 
    url: "Post/Details/{slug}", 
    defaults: new { } 

И изменить метод действий:

public ActionResult Details(string slug) 
{ 
} 

Но кроме того, что , вы do хотите идентификатор в URL-адресе. В противном случае вы не можете использовать один и тот же заголовок дважды.

+0

- это вторичные маршруты.MapRoute или это вместо стандартного? –

+0

Вам не нужно будет использовать новый маршрут или даже отредактировать старый. Простое создание 'public ActionResult Details (string slug)' должно работать, поскольку оно уже ищет этот шаблон в default default –

+0

string slug не работает с Post.Find tho? (см. обновленный вопрос) –

-1

Вы можете либо переименовать свой аргумент в своем контроллере, чтобы он соответствовал имени 'slug'. Таким образом, вместо

public ActionResult Details(int id = 0) 

Использование

public ActionResult Details(int urlslug = 0) 

Альтернатива заключается в удалении идентификатор из вашего маршрута конфигурации как

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

Имейте в виду, что когда-либо вы аргумент имя в ваших действий, что имя используется как переменная GET в вашем URL-адресе. Итак, если аргумент является int id, то ваш url должен быть таким: id = 1.

+0

slug - не int? –

+0

Затем измените тип от int до строки –

+0

Я уже пробовал, что придумал ошибку –

0

Вопрос я заметил на следующей строке:

public ActionResult Details(string urlslug) 
{ 
    Post post = db.Posts.Find(urlslug); //find only finds an eitity with a given primary key, how can I change this to find the string urlslug 

Вы можете выбрать данные с помощью urlslug с помощью Где вместо Найти

т.е. Post post = db.Posts.Where(x=> x.urlslug == urlslug).FirstOrDefault();

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