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...
6 answers
Rzeczywiście dziwne. Kroki, które u mnie działały idealnie:
- Utwórz nowy ASP.NET aplikacja MVC 3 korzystająca z domyślnego szablonu Visual Studio
- Dodaj obszar o nazwie
Admin
za pomocą programu Visual Studio designer, klikając prawym przyciskiem myszy projekt -
Dodaj nowy kontroler w
~/Areas/Admin/Controllers/MeetsController
:public class MeetsController : Controller { public ActionResult Index() { return View(); } }
Dodaj odpowiedni Widok
~/Areas/Admin/Views/Meets/Index.cshtml
-
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)
- 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?
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!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!
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
}
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.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ę.
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