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.