Проблемы ASP.Net MVC Html.ActionLink ()
-
03-07-2019 - |
Вопрос
Я использую бета-версию 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.