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ć?

Odpowiedzi:


245

Domyśliłam się..

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

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

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


11

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

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

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)

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

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


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.