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



Я просто получить ресурс не могу будет найдена ошибка. Все это очень озадачивает! Надеюсь, кто-нибудь сможет помочь...

733   6  

6 ответов:

Действительно странно. Шаги, которые прекрасно работали для меня:

  1. Создать новый ASP.NET приложение MVC 3, использующее шаблон Visual Studio по умолчанию
  2. Добавьте область под названием Admin с помощью Visual Studio designer, щелкнув правой кнопкой мыши на проекте
  3. Добавить новый контроллер в ~/Areas/Admin/Controllers/MeetsController:

    public class MeetsController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
    
  4. Добавьте соответствующий вид ~/Areas/Admin/Views/Meets/Index.cshtml

  5. В макет (~/Views/Shared/_Layout.cshtml) добавить ссылки:

    @Html.ActionLink("Admin", "Index", "Meets", new { area = "Admin" }, null)
    @Html.ActionLink("Admin", "Index", "Meets", new { area = "" }, null)
    
  6. запустите приложение.

Визуализация 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, там была мошенническая строка кода, которая необъяснимо появилась:

        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);
        }
Как вы можете видеть, где находится мой комментарий, в то или иное время я разместил маршруты.Clear () вызов в начале RegisterRoutes, что означало, что после того, как я зарегистрировал области в Application_Start, я немедленно очищал то, что я только что зарегистрировал.

Спасибо за 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 (зона ограниченного доступа), у меня есть

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 }
        );
    }
}
И, наконец, мои ссылки в моем *.страницы cshtml были бы похожи на

1) @Html.Actionlink панели("выход", "выход", новый{площадь= "общественные", контроллер="дом"})

Или

2) @Html.ActionLink ("Admin Area", "Index", new {area= "Auth", controller= "Home"})

Надеюсь, это сэкономит кому-то часы исследований! Кстати, я говорю о MVC3 здесь.

Квекс.

Это может быть не так для большинства разработчиков, но я столкнулся с этой проблемой, когда я добавил свою первую область и не построил свое решение. Как только я построил свое решение, ссылки начали заполняться правильно.

Comments

    Ничего не найдено.