c# asp.net-mvc asp.net-mvc-3 model-view-controller html.actionlink

Cómo usar MVC 3 @ Html.ActionLink dentro del código c#



asp.net-mvc asp.net-mvc-3 (5)

Hay un par de cosas malas sobre estas otras respuestas ...

La respuesta de Shark requiere que pongas el espacio de nombres de LinkExtensions en C #, lo cual no está mal, pero no me conviene.

La idea de Hunter de hacer una ayuda es mejor, pero escribir una función auxiliar para una sola URL es engorroso. Podría escribir un ayudante para ayudarlo a construir cadenas que acepten parámetros, o simplemente podría hacerlo a la vieja usanza:

var link = "Email is... click, <a href=/"" + Url.Action("action") + "/"> to unlock.</a>";

@counsellorben,

no veo ninguna razón para la complejidad; el usuario solo quiere renderizar el enrutamiento de una Acción en una cadena dura que contenga una etiqueta de anclaje. Además, ActionLink () en una cadena concatenada y escrita no compra nada, y obliga al desarrollador a utilizar LinkExtensions para las Vistas.

Si el usuario es duro acerca de usar ActionLink () o no necesita (por alguna razón) para calcular esta cadena en el constructor, hacerlo en una vista es mucho mejor.

Todavía estoy de pie y recomiendo las respuestas que tvanfosson y yo proporcionamos.

Quiero llamar al método @ Html.ActionLink dentro de la función ac # para devolver una cadena con un enlace.

Algo como esto:

string a = "Email is locked, click " + @Html.ActionLink("here to unlock.", "unlock") ;


Puede crear un método de extensión HtmlHelper:

public static string GetUnlockText(this HtmlHelper helper) { string a = "Email is locked, click " + helper.ActionLink("here to unlock.", "unlock"); return a; }

o si desea generar este enlace fuera del alcance de una página aspx, deberá crear una referencia a HtmlHelper y luego generar. Hago esto en una clase estática de UrlUtility (lo sé, la gente odia las clases estáticas y la palabra Utilidad, pero intenta enfocar). Sobrecarga según sea necesario:

public static string ActionLink(string linkText, string actionName, string controllerName) { var httpContext = new HttpContextWrapper(System.Web.HttpContext.Current); var requestContext = new RequestContext(httpContext, new RouteData()); var urlHelper = new UrlHelper(requestContext); return urlHelper.ActionLink(linkText, actionName, controllerName, null); }

Entonces puedes escribir lo siguiente desde donde tu corazón desee:

string a = "Email is locked, click " + UrlUtility.ActionLink("here to unlock.", "unlock", "controller");


Quizás intente esto:

string a = "Email is locked, click " + System.Web.Mvc.Html.LinkExtensions.ActionLink("here to unlock.", "unlock");


Su mejor opción es construir el enlace manualmente utilizando el UrlHelper disponible en el controlador. Habiendo dicho eso, sospecho que probablemente haya una mejor manera de manejar esto en una vista o vista parcial, compartida o no.

string a = "Email is locked, click <a href=/"" + Url.Action( "unlock" ) + "/">here to unlock.</a>";


Suponiendo que desea lograr esto en su controlador, hay varios aros para saltar. Debe instanciar un ViewDataDictionary y un TempDataDictionary . Luego debe tomar el ControllerContext y crear una IView . Finalmente, está listo para crear su HtmlHelper usando todos estos elementos (más su RouteCollection ).

Una vez que haya hecho todo esto, puede usar LinkExtensions.ActionLink para crear su enlace personalizado. En su opinión, deberá usar @Html.Raw() para mostrar sus enlaces, para evitar que se codifiquen en HTML. Aquí está el código necesario:

var vdd = new ViewDataDictionary(); var tdd = new TempDataDictionary(); var controllerContext = this.ControllerContext; var view = new RazorView(controllerContext, "/", "/", false, null); var html = new HtmlHelper(new ViewContext(controllerContext, view, vdd, tdd, new StringWriter()), new ViewDataContainer(vdd), RouteTable.Routes); var a = "Email is locked, click " + LinkExtensions.ActionLink(html, "here to unlock.", "unlock", "controller").ToString();

Después de mostrar todo esto, le advierto que es una idea mucho mejor hacer esto en su opinión. Agregue el error y otra información a su ViewModel, luego codifique su vista para crear el enlace. Si esto es necesario en múltiples vistas, cree un HtmlHelper para hacer la creación del enlace.

ACTUALIZAR

Para abordar one.beat.consumer, mi respuesta inicial fue un ejemplo de lo que es posible. Si el desarrollador necesita reutilizar esta técnica, la complejidad puede ocultarse en un helper estático, así:

public static class ControllerHtml { // this class from internal TemplateHelpers class in System.Web.Mvc namespace private class ViewDataContainer : IViewDataContainer { public ViewDataContainer(ViewDataDictionary viewData) { ViewData = viewData; } public ViewDataDictionary ViewData { get; set; } } private static HtmlHelper htmlHelper; public static HtmlHelper Html(Controller controller) { if (htmlHelper == null) { var vdd = new ViewDataDictionary(); var tdd = new TempDataDictionary(); var controllerContext = controller.ControllerContext; var view = new RazorView(controllerContext, "/", "/", false, null); htmlHelper = new HtmlHelper(new ViewContext(controllerContext, view, vdd, tdd, new StringWriter()), new ViewDataContainer(vdd), RouteTable.Routes); } return htmlHelper; } public static HtmlHelper Html(Controller controller, object model) { if (htmlHelper == null || htmlHelper.ViewData.Model == null || !htmlHelper.ViewData.Model.Equals(model)) { var vdd = new ViewDataDictionary(); vdd.Model = model; var tdd = new TempDataDictionary(); var controllerContext = controller.ControllerContext; var view = new RazorView(controllerContext, "/", "/", false, null); htmlHelper = new HtmlHelper(new ViewContext(controllerContext, view, vdd, tdd, new StringWriter()), new ViewDataContainer(vdd), RouteTable.Routes); } return htmlHelper; } }

Luego, en un controlador, se usa así:

var a = "Email is locked, click " + ControllerHtml.Html(this).ActionLink("here to unlock.", "unlock", "controller").ToString();

o algo así:

var model = new MyModel(); var text = ControllerHtml.Html(this, model).EditorForModel();

Si bien es más fácil usar Url.Action , ahora se extiende a una poderosa herramienta para generar cualquier margen dentro de un controlador utilizando todos los HtmlHelpers (con Intellisense completo).

Las posibilidades de uso incluyen la generación de márgenes usando modelos y plantillas de editor para correos electrónicos, generación de pdf, entrega de documentos en línea, etc.