ASP.NET MVC ' Html.ActionLink 'между" областями"
Я добавил новую область в свой проект MVC3 и пытаюсь связать страницу _Layout с новой областью. Я добавил область под названием "Admin", которая имеет контроллер "Meets".
Я использовал конструктор visual studio, чтобы добавить область, чтобы она имела правильный класс регистрации области и т. д., и глобальный.файл asax регистрирует все области.
Однако, когда я использую следующие 2 ссылки действий на странице в корне, я сталкиваюсь с несколькими проблемами:
@Html.ActionLink("Admin", "Index", "Meets", new { area = "Admin" }, null)
@Html.ActionLink("Admin", "Index", "Meets", new { area = "" }, null)
При нажатии на обе ссылки, Я перехожу к контроллеру Meets в административной области, где приложение затем выдает ошибку, говорящую, что оно не может найти страницу индекса (даже если страница индекса присутствует в папке Views в подкаталоге Area.
Href для 1-го звена выглядит следующим образом:
http://localhost/BCC/Meets?area=Admin
И href для 2-го звена выглядит так:
http://localhost/BCC/Meets
Также, если я нажму ссылку, которую я ожидаю создать:
http://localhost/BCC/Admin/Meets
Я просто получить ресурс не могу будет найдена ошибка. Все это очень озадачивает! Надеюсь, кто-нибудь сможет помочь...
6 ответов:
Действительно странно. Шаги, которые прекрасно работали для меня:
- Создать новый ASP.NET приложение MVC 3, использующее шаблон Visual Studio по умолчанию
- Добавьте область под названием
Adminс помощью Visual Studio designer, щелкнув правой кнопкой мыши на проектеДобавить новый контроллер в
~/Areas/Admin/Controllers/MeetsController:public class MeetsController : Controller { public ActionResult Index() { return View(); } }Добавьте соответствующий вид
~/Areas/Admin/Views/Meets/Index.cshtmlВ макет (
~/Views/Shared/_Layout.cshtml) добавить ссылки:@Html.ActionLink("Admin", "Index", "Meets", new { area = "Admin" }, null) @Html.ActionLink("Admin", "Index", "Meets", new { area = "" }, null)- запустите приложение.
Визуализация HTML для якорей:
<a href="/Admin/Meets">Admin</a> <a href="/Meets">Admin</a>Как и ожидалось, первое звено работает, а второе-нет.
Так в чем же разница с вашей установкой?
Другой вариант-использовать RouteLink () вместо ActionLink (), который полностью обходит регистрацию области:
Версия ActionLink:
Html.ActionLink("Log Off", "LogOff", "Account", new { area = "" }, null)Версия RouteLink:
Html.RouteLink("Log Off", "Default", new { action = "LogOff", controller = "Account" })Второй параметр - это "имя маршрута", которое регистрируется в Global.асакс.cs и в различных подклассах "AreaRegistration". Чтобы использовать' RouteLink ' для связи между различными областями, вам нужно только указать правильное название маршрута.
В следующем примере показано, как я буду генерировать три ссылки на разные области из общего частичного, который работает правильно независимо от того, в какой области я нахожусь (если таковые имеются):
@Html.RouteLink("Blog", "Blog_default", new { action = "Index", controller = "Article" }) <br/> @Html.RouteLink("Downloads", "Download_default", new { action = "Index", controller = "Download" }) <br/> @Html.RouteLink("About", "Default", new { action = "Index", controller = "About" })Счастливого кодирования!
Я понял это - я создал новый тестовый проект и сделал точно то же самое, что делал раньше, и это сработало...затем, после дальнейшего изучения всех вещей, связанных с маршрутом между двумя проектами, я обнаружил несоответствие.
В глобальном масштабе.файл asax в моем приложении BCC, там была мошенническая строка кода, которая необъяснимо появилась:
Как вы можете видеть, где находится мой комментарий, в то или иное время я разместил маршруты.Clear () вызов в начале RegisterRoutes, что означало, что после того, как я зарегистрировал области в Application_Start, я немедленно очищал то, что я только что зарегистрировал.public static void RegisterRoutes(RouteCollection routes) { // Problem here routes.Clear(); routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); }Спасибо за help...it в конечном счете это привело к моему спасению!
Убедитесь, что ваш класс
AdminAreaRegistrationвыглядит следующим образом:public class AdminAreaRegistration : AreaRegistration { public override string AreaName { get { return "Admin"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Admin_default", "Admin/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } ); } }И что у вас есть это в
Global.asax.cs:protected void Application_Start() { ... // ViewEngine Registration AreaRegistration.RegisterAllAreas(); ... // Other route registration }
Я решил эту проблему, сделав следующее.
В моем глобальном.асакс.cs, у меня есть
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); } protected void Application_Start() { //Initialise IoC IoC.Initialise(); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); }В моей публичной регистрации.cs (Public Area), у меня есть
public class PublicAreaRegistration : AreaRegistration { public override string AreaName { get { return "Public"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute("Root", "", new { controller = "Home", action = "Index" }); context.MapRoute( "Public_default", "Public/{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional } , new[] { "<Project Namespace here>.Areas.Public.Controllers" } ); } }В моей AuthAreaRegistration.cs (зона ограниченного доступа), у меня есть
И, наконец, мои ссылки в моем *.страницы cshtml были бы похожи наpublic class AuthAreaRegistration : AreaRegistration { public override string AreaName { get { return "Auth"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Auth_default", "Auth/{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }1) @Html.Actionlink панели("выход", "выход", новый{площадь= "общественные", контроллер="дом"})
Или
2) @Html.ActionLink ("Admin Area", "Index", new {area= "Auth", controller= "Home"})
Надеюсь, это сэкономит кому-то часы исследований! Кстати, я говорю о MVC3 здесь.
Квекс.
Это может быть не так для большинства разработчиков, но я столкнулся с этой проблемой, когда я добавил свою первую область и не построил свое решение. Как только я построил свое решение, ссылки начали заполняться правильно.
Comments