Come specificare un nome di area in un collegamento di azione?


156

Ho una pagina master condivisa che sto usando da 2 aree diverse nella mia app mvc 2. La pagina principale ha un link azione che attualmente specifica il controller e l'azione, ma ovviamente il link non funziona se mi trovo nell'area sbagliata. Non vedo alcun sovraccarico per actionlink che accetta un parametro area, è possibile farlo?

Risposte:


245

Capito..

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

3
@ Pure.Krome - sì. Niente di intuitivo al riguardo!
Jeremy

3
Assicurarsi che non vi sia spazio bianco prima o dopo il Nome area. Altrimenti lo ignorerà ... e poi ti chiederai per quattro ore cosa c'è di sbagliato ... proprio come me.
Piotr Kula,

Come si aggiungono i parametri?
Yorro,

Come appare tradotto in link? Voglio dire, quando il modulo viene reso e restituito al client.
FrenkyB,

79

Qualcosa in cui mi sono imbattuto subito dopo, che immagino possano incorrere in altri: Se hai bisogno di collegarti all'interno di un'area a un'azione non in un'area, devi comunque specificare l'Area come stringa vuota.

Ad esempio, ho spostato del codice MVC in un'area e ho scoperto che dovevo aggiornare gli URL nella pagina principale che faceva riferimento ad altre pagine del sito.

Per specificare un URL per qualcosa che non si trova in un'area, utilizzare

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

4
Questo è un ottimo consiglio! Ma fornisce risultati non previsti con MVC 2. Piccola correzione - Html.ActionLink ("home", "Index", new {area = "", controller = "Home"})
Alexander Beletsky

15

Uso:

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

Nota : il 4 ° parametro deve passare il percorso Values, se si passa un parametro vuoto prenderà in considerazione la struttura della radice e se si passa il valore appropriato lo utilizzerà come area.

Inoltre, non dimenticare di utilizzare nullo new{}come il 5o parametro perché il passaggio nullo new {}durante la creazione del link dell'azione non sovraccaricherà il metodo per (text,action,controller,route data)o il suo, (text,action,controller,route data,html attribute)quindi usa il metodo corretto


11

In MVC2 dare ha area="root"funzionato per me come di seguito

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

6

Un trucco che puoi fare se stai usando molto un'area in una Vista è definirla come una variabile in alto:

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

@Html.Action("Something", "Somewhere", awesomeArea)
@Html.ActionLink("Stuff", "FooBar", awesomeArea)

4

Ecco cosa mi è venuta in mente come soluzione per consentire a un utente di collegarsi ai sistemi di autenticazione predefiniti.

Ognuna delle mie aree ha una versione del file _LoginPartial.cshtml.

Probabilmente sono riuscito a far sì che l'applicazione usasse una singola versione del file, tuttavia continuavo a incorrere in errori quando provavo a utilizzare un singolo login parziale.

È solo una leggera modifica al loginpartial generato originale, ma sembra funzionare bene se usato in aree specifiche.

Ecco il codice che viene utilizzato in tutti loro:

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

L'impostazione esplicita ha htmlAttributes:funzionato molto bene per l'utilizzo di più parametri.
Travis J

2

Se non è possibile utilizzare il collegamento di applicazione Web standart come Informazioni, Home, Contatti ecc. Dall'area. Tu cambi linea

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

a partire dal

Vista \ Shared_Layout.cshtml


1

Nella mia app ASP Net Core, aggiungo semplicemente l'area agli attributi html in questo modo:

@Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" , id = @Model.ID, name = @Model.name })

0

utilizzando

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

Raggiungerà ciò che stai cercando.

DisplayText è ciò che verrà visualizzato (lo stesso di <a href="#">DisplayText</a>), ActionName è il metodo chiamato nel controller e ControllerName è ovviamente il controller che si desidera chiamare! Il prossimo parametro è "Valore percorso" dove aggiungere la propria area. Se ci si trova attualmente in un'area e si desidera tornare alla radice, Home/Indexad esempio, si lascerebbe il valore come una stringa vuota, ad es new { area = ""}. Il valore finale è "Attributi HTML" e dove aggiungere una classe se lo si desidera e dovrebbe essere un nullif se non si hanno attributi da aggiungere. Ma dato che l'ultimo parametro è visto come "Attributi HTML"; per poter riconoscere i valori del percorso, questo dovrebbe esserenull

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.