2010-01-10 19 views
149

Mam wspólną stronę wzorcową, której używam z 2 różnych obszarów w mojej aplikacji mvc 2. Strona wzorcowa zawiera link akcji, który aktualnie określa kontroler i działanie, ale oczywiście link nie działa, jeśli znajduję się w niewłaściwym miejscu. Nie widzę przeciążenia dla actionlink, który pobiera parametr area, czy można to zrobić?Jak określić nazwę obszaru w łączu akcji?

Odpowiedz

233

Zdobione ..

Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" }, new{}) 
+1

Tak, to jest dobre podejście. – Ravia

+16

AH !!! to jest podstępne 'nowe {}' na końcu ciągle zapominam o tym! –

+3

@ Pure.Krome - tak. Nic intuicyjnego w tym! – Jeremy

77

Coś wpadłem zaraz po tym, że inni mogą sobie wyobrazić napotkasz: Jeśli trzeba połączyć ze obrębie obszaru działania, które nie w obszarze, ty nadal trzeba określić obszar jako pusty ciąg znaków.

Na przykład, przeniosłem kod MVC do obszaru i stwierdziłem, że muszę zaktualizować adresy URL na stronie wzorcowej, która odnosi się do innych stron w witrynie.

Aby określić adres URL do czegoś nie w obszarze, należy

Html.ActionLink("home", "Index", new { area = "", controller = "Home" }) 
+4

To bardzo dobra wskazówka! Ale daje nieoczekiwane wyniki z MVC 2. Mała korekta - Html.ActionLink ("home", "Index", new {area = "", controller = "Home"}) –

9

W MVC2 dając area="root" pracował dla mnie jak poniżej

Html.ActionLink("Home", "Index", "Home", new { Area = "root" }, new{}) 
4

Oto co wymyśliłem jako rozwiązanie umożliwić użytkownikowi połączenie z gotowymi systemami uwierzytelniającymi.

Każdy z moich obszarów ma wersję pliku _LoginPartial.cshtml.

Prawdopodobnie mógłbym pobrać aplikację, aby użyć jednej wersji pliku, jednak ciągle napotykałem błędy podczas próby użycia pojedynczego logowania częściowego.

To tylko niewielka modyfikacja oryginalnej wygenerowanej strony logowania, ale wygląda na to, że działa dobrze, gdy jest używana w określonych obszarach.

Oto kod, który zostanie użyty w każdym z nich:

@if (Request.IsAuthenticated) 
{ 
    <text> 
    Hello, @Html.ActionLink(User.Identity.Name, "Manage", "Account", new { area = "" }, htmlAttributes: new { @class = "username", title = "Manage" })! 
    @using (Html.BeginForm("LogOff", "Account", new { area = "" }, FormMethod.Post, new { id = "logoutForm" })) 
{ 
     @Html.AntiForgeryToken() 
     <a href="javascript:document.getElementById('logoutForm').submit()">Log off</a> 
} 
    </text> 
} 
else 
{ 
    <ul> 
     <li>@Html.ActionLink("Register", "Register", "Account", new { area = "" }, htmlAttributes: new { id = "registerLink" })</li> 
     <li>@Html.ActionLink("Log in", "Login", "Account", new { area = "" }, htmlAttributes: new { id = "loginLink" })</li> 
    </ul> 
} 
+0

Jawnie ustawienie 'htmlAttributes:' działało bardzo dobrze za używanie wielu parametrów. –

12

Zastosowanie:

Html.ActionLink("Text", "ActionName", "ControllerName", new { Area = "AreaName" }, null) 

Uwaga: 4 parametr jest przejść trasą Values, jeśli przejdą pusty parametr rozważy strukturę korzenia i jeśli przekażesz odpowiednią wartość, użyje go jako obszaru.

Również nie zapomnij użyć null lub new{} jako 5th parametru ponieważ przechodząc null lub new {} podczas tworzenia linku nie spowoduje przeciążenia metody (text,action,controller,route data) lub jego (text,action,controller,route data,html attribute) więc używać właściwej metody

6

Zgrabny sztuczki można zrobić jeśli korzystasz z obszaru dużo w widoku to zdefiniuj go jako zmienną u góry:

@{ var awesomeArea = new { area = "Awesome" }; } 

@Html.Action("Something", "Somewhere", awesomeArea) 
@Html.ActionLink("Stuff", "FooBar", awesomeArea) 
Powiązane problemy