ASP.NET MVC ' Html.ActionLink "between" Areas"

Dodałem nowy obszar do mojego projektu MVC3 i próbuję połączyć się ze stroną _Layout do nowego obszaru. Dodałem obszar o nazwie "Admin", który ma kontroler "spełnia".

Użyłem projektanta visual studio, aby dodać obszar, więc ma poprawną klasę rejestracji obszaru itp., a global.plik asax rejestruje wszystkie obszary.

Jednak, gdy używam następujących linków akcji 2 na stronie w korzeniu, napotykam kilka problemów:

@Html.ActionLink("Admin", "Index", "Meets", new { area = "Admin" }, null)
@Html.ActionLink("Admin", "Index", "Meets", new { area = "" }, null)

Po kliknięciu obu linków, Przenoszę się do kontrolera Meets w obszarze administracyjnym, gdzie aplikacja przechodzi do wyświetlania błędu mówiącego, że nie może znaleźć strony indeksu (nawet jeśli strona indeksu jest obecna w folderze widoki w podkatalogu Area.

Href dla pierwszego linku wygląda tak:

http://localhost/BCC/Meets?area=Admin

A href dla drugiego linku wygląda tak:

http://localhost/BCC/Meets

Również jeśli nacisnę link, który spodziewam się utworzyć:

http://localhost/BCC/Admin/Meets

Po prostu dostaję zasób nie może Znajdź błąd. Wszystko bardzo kłopotliwe! Mam nadzieję, że ktoś może pomóc...

Author: Shaun Wilson, 2011-03-25

6 answers

Rzeczywiście dziwne. Kroki, które u mnie działały idealnie:

  1. Utwórz nowy ASP.NET aplikacja MVC 3 korzystająca z domyślnego szablonu Visual Studio
  2. Dodaj obszar o nazwie Admin za pomocą programu Visual Studio designer, klikając prawym przyciskiem myszy projekt
  3. Dodaj nowy kontroler w ~/Areas/Admin/Controllers/MeetsController:

    public class MeetsController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
    
  4. Dodaj odpowiedni Widok ~/Areas/Admin/Views/Meets/Index.cshtml

  5. W layoucie (~/Views/Shared/_Layout.cshtml) Dodaj linki:

    @Html.ActionLink("Admin", "Index", "Meets", new { area = "Admin" }, null)
    @Html.ActionLink("Admin", "Index", "Meets", new { area = "" }, null)
    
  6. Uruchom aplikację.

Rendered HTML dla anchorów:

<a href="/Admin/Meets">Admin</a>
<a href="/Meets">Admin</a>

Zgodnie z oczekiwaniami pierwszy link działa, a drugi nie.

Więc jaka jest różnica w konfiguracji?

 71
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-25 12:13:37

Inną opcją jest użycie routelink () zamiast ActionLink (), które całkowicie omija rejestrowanie obszaru:

Wersja ActionLink:

Html.ActionLink("Log Off", "LogOff", "Account", new { area = "" }, null)

Wersja RouteLink:

Html.RouteLink("Log Off", "Default", 
    new { action = "LogOff", controller = "Account" })

Drugi parametr to" nazwa trasy", która jest zarejestrowana w Global.asax.cs oraz w różnych podklasach "AreaRegistration". Aby użyć "RouteLink" do łączenia różnych obszarów, wystarczy podać poprawną nazwę trasy.

Poniższy przykład pokazuje jak wygenerowałbym trzy linki do różnych obszarów z części współdzielonej, które działają poprawnie niezależnie od tego, w którym obszarze Jestem " (jeśli w ogóle): {]}

@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" })
Szczęśliwego kodowania!
 29
Author: Shaun Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-21 00:47:40

Rozgryzłem to - stworzyłem nowy projekt testowy i zrobiłem dokładnie to samo, co robiłem wcześniej i zadziałało...następnie po dalszej kontroli wszystkich rzeczy związanych z trasą między dwoma projektami znalazłem rozbieżność.

W świecie.plik asax w mojej aplikacji BCC, pojawiła się nieuczciwa linia kodu, która w niewytłumaczalny sposób pojawiła się:

        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);
        }

Jak widać, gdzie jest mój komentarz, w pewnym momencie lub w innym miejscu umieściłem trasy.Wywołanie Clear () na początku RegisterRoutes, co oznaczało, że po zarejestrowaniu obszarów w Application_Start, byłem następnie natychmiast wyczyścić to, co właśnie zarejestrowałem.

Dzięki za help...it ostatecznie doprowadziło do mojego zbawienia!

 7
Author: jcvandan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-25 12:30:12

Sprawdź czy Twoja klasaAdminAreaRegistration wygląda tak:

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 }
        );
    }
}

I że masz to w Global.asax.cs:

protected void Application_Start()
{
    ... // ViewEngine Registration
    AreaRegistration.RegisterAllAreas();
    ... // Other route registration
}
 3
Author: Mikael Östberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-25 12:13:53

Rozwiązałem ten problem wykonując następujące czynności.

W moim świecie.asax.cs, mam
    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);
    }
W mojej publicznej rejestracji.cs (Public Area), mam
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" }
        );
    }
}
/ Align = "left" / cs (Area for Restricted access), mam
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 }
        );
    }
}

I wreszcie moje linki w moim *.strony w cshtml będą takie jak

1) @Html.ActionLink ("Wyloguj"," Wyloguj", new{area=" Public", controller="Home"})

Lub

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

Mam nadzieję, że to oszczędza komuś godziny badań! BTW, mówię tu o MVC3.

Kwex.
 2
Author: Kwex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-10 17:05:50

To może nie być w przypadku większości deweloperów, ale napotkałem ten problem, gdy dodałem mój pierwszy obszar i nie zbudowałem mojego rozwiązania. Jak tylko zbudowałem moje rozwiązanie, linki zaczęły poprawnie wypełniać się.

 1
Author: Abhi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-06 21:50:27