tutorial net mvc asp asp.net-mvc asp.net-mvc-2 asp.net-mvc-areas

asp.net mvc - net - ¿Cómo especificar un nombre de área en un enlace de acción?



web forms c# (7)

Tengo una página maestra compartida que estoy usando desde 2 áreas diferentes en mi aplicación mvc 2. La página maestra tiene un enlace de acción que actualmente especifica el controlador y la acción, pero por supuesto el enlace no funciona si estoy en el área incorrecta. No veo ninguna sobrecarga para actionlink que tome un parámetro de área, ¿es posible?


Algo con lo que me encontré después de esto, que imagino que otros podrían encontrar: si necesita vincular desde un área a una acción que no está en un área, aún necesita especificar el Área como una cadena vacía.

Por ejemplo, moví un código MVC a un área y descubrí que necesitaba actualizar las URL en la página maestra que hacía referencia a otras páginas en el sitio.

Para especificar una URL a algo que no se encuentre en un área, use

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


En MVC2 dando area="root" funcionó para mí como se muestra a continuación

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


Esto es lo que se me ocurrió como una solución para permitir que un usuario se vincule a los sistemas de autenticación preconstruidos.

Cada una de mis áreas tiene una versión del archivo _LoginPartial.cshtml.

Probablemente podría hacer que la aplicación use una sola versión del archivo, sin embargo, seguí encontrando errores al intentar usar un solo inicio de sesión parcial.

Es solo una ligera modificación del inicio de sesión generado originalmente, pero parece funcionar bien cuando se usa en áreas específicas.

Aquí está el código que se usa en todos ellos:

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


Lo averigué..

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


Si no puede usar el enlace de aplicación web estándar como Acerca de, Casa, Contac, etc. del área. Cambias líneas

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

de

Views / Shared_Layout.cshtml


Un buen truco que puede hacer si utiliza mucho un área en una Vista es definirla como una variable en la parte superior:

@{ var awesomeArea = new { area = "Awesome" }; } @Html.Action("Something", "Somewhere", awesomeArea) @Html.ActionLink("Stuff", "FooBar", awesomeArea)


Utilizar:

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

Nota : el cuarto parámetro es para pasar Values ruta, si pasa un parámetro vacío considerará la estructura raíz y si pasa el valor apropiado, lo usa como área.

Tampoco olvide utilizar null o new{} como el 5to parámetro porque pasar null o new {} mientras crea el enlace de acción no sobrecargará el método para (text,action,controller,route data) o su (text,action,controller,route data,html attribute) así que use el método apropiado