Jak określić nazwę obszaru w linku do akcji?

156

Mam udostępnioną stronę wzorcową, której używam z 2 różnych obszarów w mojej aplikacji MVC 2. Strona wzorcowa ma łącze akcji, które obecnie określa kontroler i akcję, ale oczywiście łącze nie działa, jeśli jestem w niewłaściwym obszarze. Nie widzę przeciążenia dla actionlink, który przyjmuje parametr obszaru, czy można to zrobić?

Jeremy
źródło

Odpowiedzi:

245

Domyśliłam się..

Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" }, new{})
Jeremy
źródło
3
@ Pure.Krome - tak. Nie ma w tym nic intuicyjnego!
Jeremy
3
Upewnij się, że przed ani po nazwie obszaru nie ma spacji. W przeciwnym razie po prostu to zignoruje ... a potem przez cztery godziny będziesz się zastanawiać, co jest nie tak ... tak jak ja.
Piotr Kula
Jak dodajesz tam parametry?
Yorro
Jak to wygląda przetłumaczone na link? Mam na myśli - kiedy forma jest renderowana i zwracana klientowi.
FrenkyB
79

Coś, na co natknąłem się zaraz po tym, a wyobrażam sobie, że inni mogą napotkać: Jeśli chcesz połączyć się z działaniem spoza obszaru, nadal musisz określić obszar jako pusty ciąg.

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

Aby określić adres URL czegoś spoza obszaru, użyj

Html.ActionLink("home", "Index", new { area = "", controller = "Home" })
Frank Schwieterman
źródło
4
To bardzo dobra wskazówka! Ale daje nieoczekiwane rezultaty z MVC 2 .. Mała poprawka - Html.ActionLink ("home", "Index", new {area = "", controller = "Home"})
Alexander Beletsky
15

Posługiwać się:

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

Uwaga : czwarty parametr to przekazanie trasy Values, jeśli podasz pusty parametr, uwzględni strukturę root i jeśli przekażesz odpowiednią wartość, użyje go jako obszaru.

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

Subhash Rao
źródło
11

W MVC2 dawanie area="root"działało jak poniżej

Html.ActionLink("Home", "Index", "Home", new { Area = "root" }, new{})
Sreejith
źródło
6

Sprytną sztuczką, którą możesz zrobić, jeśli często używasz obszaru w Widoku, jest zdefiniowanie go jako zmiennej u góry:

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

@Html.Action("Something", "Somewhere", awesomeArea)
@Html.ActionLink("Stuff", "FooBar", awesomeArea)
dav_i
źródło
4

Oto, co wymyśliłem jako rozwiązanie umożliwiające użytkownikowi łączenie się z gotowymi systemami uwierzytelniania.

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

Prawdopodobnie mógłbym sprawić, by aplikacja używała jednej wersji pliku, jednak ciągle napotykałem błędy podczas próby użycia częściowego logowania z pojedynczym logowaniem.

Jest to tylko niewielka modyfikacja pierwotnie wygenerowanego loginu, ale wydaje się działać dobrze, gdy jest używany w określonych obszarach.

Oto kod, który jest używany we wszystkich 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>
}
Anthony Hart
źródło
Jawne ustawienie htmlAttributes:działało bardzo dobrze w przypadku używania wielu parametrów.
Travis J
2

Jeśli nie możesz skorzystać ze standardowego łącza do aplikacji internetowej, takiego jak Informacje, Strona główna, Kontakt itp. Z obszaru. Zmieniasz linie

@Html.ActionLink("Ana Sayfa", "Index", "Home", new { area = "" }, new {})

z

Views \ Shared_Layout.cshtml

ErdincDonmez
źródło
1

W mojej aplikacji ASP Net Core po prostu dodaję obszar do atrybutów HTML w następujący sposób:

@Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" , id = @Model.ID, name = @Model.name })
Moleius
źródło
0

Za pomocą

@Html.ActionLink("DisplayText", "ActionName", "ControllerName", new { area = "AreaName"}, null)

Osiągnie to, czego szukasz.

DisplayText jest tym, co zostanie wyświetlone (tak samo jak <a href="#">DisplayText</a>), ActionName to metoda wywoływana w kontrolerze, a ControllerName jest oczywiście kontrolerem, który chcesz wywołać! Następnym parametrem jest „Wartość trasy”, gdzie można dodać obszar. Jeśli aktualnie jesteś w Obszarze i chcesz na przykład wrócić do swojego katalogu głównego Home/Index, zostaw wartość jako pusty ciąg, np new { area = ""}. Ostateczna wartość to „Atrybuty HTML” i miejsce, w którym można dodać klasę, jeśli chcesz, a nulljeśli nie masz żadnych atrybutów do dodania, powinna być to wartość . Ale ponieważ ostatni parametr jest postrzegany jako „Atrybuty HTML”; aby wartości tras były rozpoznawane, powinno to byćnull

Rob P
źródło