Вопрос

Я использую бета-версию MVC, чтобы написать простое приложение для понимания ASP.Net MVC. Приложение представляет собой простой сайт для обмена фото / видео с тегами. Я работаю над проектом скелета MVC. Я добавил несколько Html.ActionLink () в панель навигации, но у меня возникла проблема с одним из Html.ActionLink (), который я добавил в одном месте.

Я хочу, чтобы ~ / Tags показывал все теги из базы данных, и я хочу, чтобы ~ / Tags / {tag} отображал список всех файлов, которые отмечены тегом {tag}. Это работает, как и ожидалось, но когда я следую за ~ / Tags / {tag}, он меняет Html.ActionLink () в навигационной панели на тот же, что и ссылка ~ / Tags / {tag}, а не просто указывает на ~ / Теги. Я не понимаю, почему ActionLink () в моей панели навигации меняется, когда я следую за ~ / Tags / {tag}. Если я перейду к другой ссылке в проекте, ActionLink () будет работать как положено.

У меня есть actionlink и маршрут, настроенный так. Мой TagsController имеет это действие индекса. Инт? для пейджингового контроля. У меня есть два представления, одно называется «Все», а другое - «Детали». Что я делаю не так?

        Html.ActionLink("Tags", "Index", "Tags") // In navigation bar

        routes.MapRoute(
            "Tags",
            "Tags/{tag}",
            new
            {
              controller = "Tags", action = "Index", tag = "",
            });

        public ActionResult Index(string tag, int? id )
        {  // short pseudocode
           If (tag == "")
             return View("All", model)
           else
             return View("Details", model) 
        }
Это было полезно?

Решение

Я думаю, что вам нужно обработать экземпляр yoursite.com/Tags/, поскольку вы обрабатываете только один с тегом.

Я бы создал другой маршрут:

routes.MapRoute(
  "TagsIndex", //Called something different to prevent a conflict with your other route
  "Tags/",
  new { controller = "Tags", action = "Index" }
);

routes.MapRoute(
  "Tags",
  "Tags/{tag}",
  new { controller = "Tags", action = "Tag", tag = "" }
);


/* In your controller */
public ActionResult Index() // You could add in the id, if you're doing paging here
{
  return View("All", model);
}

public ActionResult Tag(string tag, int? id)
{
  if (string.IsNullOrEmpty(tag))
  {
    return RedirectToAction("Index");
  }

  return View("Details", model);
}

Другие советы

В дополнение к созданию дополнительного маршрута, как упоминает Дэн Аткинсон, вы также должны избавиться от оператора if в контроллере и создать еще один метод контроллера (называемый Details) для обработки деталей тега. Операторы if в контроллере, определяющие, какое представление отображать, являются запахом кода. Пусть механизм маршрутизации выполнит свою работу, и код вашего контроллера будет проще и проще в обслуживании.

Я бы посоветовал вам взглянуть на выражения Lamda, чтобы справиться с этим, в будущем у вас может получиться «суп из тегов».

Кроме того, убедитесь, что вы загрузили Microsoft.Web.Mvc dll, отличается от System.Web.Mvc.

Где найти Microsoft.Web.Mvc.dll

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top