2011-05-19 25 views
8

Quiero poner un botón como el texto de un @ActionLink() pero no puedo porque HTML-escapa de mi cadena ... Encontré el mecanismo @Html.Raw() y he probado el @ActionLink().ToHtmlString() pero no puedo entender cómo para juntarlo ...Raw ActionLink linkText

Encontré an article que describe la construcción de una extensión para un fin similar pero es demasiado complicado ... ¿debe haber una manera fácil?

Respuesta

13

Se podría escribir un ayudante:

public static class HtmlExtensions 
{ 
    public static IHtmlString MyActionLink(
     this HtmlHelper htmlHelper, 
     string linkText, 
     string action, 
     string controller, 
     object routeValues, 
     object htmlAttributes 
    ) 
    { 
     var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext); 
     var anchor = new TagBuilder("a"); 
     anchor.InnerHtml = linkText; 
     anchor.Attributes["href"] = urlHelper.Action(action, controller, routeValues); 
     anchor.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 
     return MvcHtmlString.Create(anchor.ToString()); 
    } 
} 

y luego utilizar este helper:

@Html.MyActionLink(
    "<span>Hello World</span>", 
    "foo", 
    "home", 
    new { id = "123" }, 
    new { @class = "foo" } 
) 

la que las rutas por defecto dados producirían:

<a class="foo" href="/home/foo/123"><span>Hello World</span></a> 
+0

oh eso es mucho mejor. Ojalá hubieran proporcionado un interruptor para el método existente. Supongo que no quería tener que escribirle un ayudante, pero tu solución es bastante liviana. ¡Gracias! – ekkis

+3

aunque, honestamente, para el caso, simplemente puedo hacer 'whatever '' – ekkis

+0

Esto resolvió este problema para mí, ¡gracias! –

1

Si desea crear una enlace de acción personalizada que utiliza la biblioteca T4MVC, puede escribir el código siguiente:

public static System.Web.IHtmlString DtxActionLink(
     this System.Web.Mvc.HtmlHelper html, string linkText, 
     System.Web.Mvc.ActionResult actionResult = null, 
     object htmlAttributes = null) 
    { 
     System.Web.Mvc.IT4MVCActionResult oT4MVCActionResult = 
      actionResult as System.Web.Mvc.IT4MVCActionResult; 

     if (oT4MVCActionResult == null) 
     { 
      return (null); 
     } 

     System.Web.Mvc.UrlHelper oUrlHelper = 
      new System.Web.Mvc.UrlHelper(html.ViewContext.RequestContext); 

     System.Web.Mvc.TagBuilder oTagBuilder = 
      new System.Web.Mvc.TagBuilder("a"); 

     oTagBuilder.InnerHtml = linkText; 

     oTagBuilder.AddCssClass("btn btn-default"); 

     oTagBuilder.Attributes["href"] = oUrlHelper.Action 
      (oT4MVCActionResult.Action, 
      oT4MVCActionResult.Controller, 
      oT4MVCActionResult.RouteValueDictionary); 

     oTagBuilder.MergeAttributes 
      (new System.Web.Routing.RouteValueDictionary(htmlAttributes)); 

     return (html.Raw(oTagBuilder.ToString())); 
    }