Como especificar um nome de área em um link de ação?

156

Eu tenho uma página mestra compartilhada que estou usando em 2 áreas diferentes no meu aplicativo mvc 2. A página mestra tem um link de ação que atualmente especifica o controlador e a ação, mas é claro que o link não funcionará se eu estiver na área errada. Não vejo sobrecarga para o actionlink que usa um parâmetro de área, é possível fazer isso?

Jeremy
fonte

Respostas:

245

Descobri isso ..

Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" }, new{})
Jeremy
fonte
3
@ Pure.Krome - sim. Nada intuitivo sobre isso!
Jeremy
3
Verifique se não há espaços em branco antes ou depois do nome da área. Caso contrário, ele simplesmente o ignorará ... e fará com que você se pergunte por quatro horas o que está errado ... assim como eu.
Piotr Kula 23/05
Como você adiciona parâmetros lá?
29 Y15
Como isso se traduz no link? Quero dizer - quando o formulário é renderizado e retornado ao cliente.
FrenkyB
79

Algo em que encontrei logo após isso, que imagino que outros possam encontrar: Se você precisar vincular de uma área a uma ação que não está em uma área, ainda precisará especificar a Área como uma sequência vazia.

Por exemplo, mudei algum código MVC para uma área e descobri que precisava atualizar os URLs na página mestre que referenciava outras páginas no site.

Para especificar um URL para algo que não está em uma área, use

Html.ActionLink("home", "Index", new { area = "", controller = "Home" })
Frank Schwieterman
fonte
4
Esta é uma dica muito boa! Mas fornece resultados não esperados com o MVC 2. Correção pequena - Html.ActionLink ("home", "Index", new {area = "", controller = "Home"})
Alexander Beletsky
15

Usar:

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

Nota : O quarto parâmetro é passar a rota Values, se você passar um parâmetro vazio, ele considerará a estrutura raiz e se você passar o valor apropriado, use-o como área.

Também não se esqueça de usar nullou new{}como o quinto parâmetro, porque passar nullou new {}criar um link de ação não sobrecarregará o método (text,action,controller,route data)ou, (text,action,controller,route data,html attribute)portanto, usará o método apropriado

Subhash Rao
fonte
11

No MVC2 dando area="root"funcionou pra mim como abaixo

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

Um bom truque que você pode fazer se estiver usando muito uma área em um View é defini-lo como uma variável na parte superior:

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

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

Aqui está o que eu criei como uma solução para permitir que um usuário se vincule aos sistemas de autenticação pré-criados.

Cada uma das minhas áreas possui uma versão do arquivo _LoginPartial.cshtml.

Provavelmente eu poderia fazer com que o aplicativo usasse uma única versão do arquivo, no entanto, continuava com erros ao tentar usar um único login parcial.

É apenas uma ligeira modificação no componente de login original gerado, mas parece funcionar bem quando usado em áreas específicas.

Aqui está o código que é usado em todos eles:

@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
fonte
Definir explicitamente o resultado htmlAttributes:funcionou muito bem para o uso de vários parâmetros.
Travis J
2

Se você não pode usar o link de aplicativo da Web padrão, como Sobre, Casa, Contac etc. da área. Você muda de linha

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

de

Views \ Shared_Layout.cshtml

ErdincDonmez
fonte
1

No meu aplicativo ASP Net Core, basta adicionar a área aos atributos html da seguinte forma:

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

Usando

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

Vai conseguir o que você procura.

O DisplayText é o que será exibido (o mesmo que <a href="#">DisplayText</a>), o ActionName é o método que está sendo chamado no controlador e ControllerName é obviamente o controlador que você deseja chamar! O próximo parâmetro é 'Valor da rota', onde você adicionaria sua área. Se você está atualmente em uma área e deseja navegar de volta à sua raiz, Home/Indexpor exemplo, você deixaria o valor como uma string vazia, por exemplo new { area = ""}. O valor final é 'Html Attributes' e onde você adicionaria uma classe se desejasse e deveria ser um nullse não tiver nenhum atributo a ser adicionado. Mas como o último parâmetro é visto como 'Html Attributes'; Para que os valores da rota sejam reconhecidos, isso deve sernull

Rob P
fonte