Eu tenho duas perguntas:
Html.ActionLink()
em uma exibição MVC (na verdade, isso é Site.Master
). Não há uma versão sobrecarregada que não permita o texto do link, e quando eu tento passar apenas uma string
vazia, o compilador me diz que precisa de uma string não vazia.
Como posso consertar isso?
Eu preciso colocar tags dentro da tag âncora, mas não está funcionando com
Html.ActionLink();
. Eu gostaria de ver a seguinte saída:
Texto do período
Como posso colocar tags dentro da tag de âncora no asp.net MVC?
Em vez de usar o Html.ActionLink, você pode renderizar uma url via Url.Action
">Text Text
E para fazer uma URL em branco, você poderia ter
">
Uma extensão HtmlHelper personalizada é outra opção. Nota : ParameterDictionary é meu próprio tipo. Você poderia replace um RouteValueDictionary, mas teria que construí-lo de forma diferente.
public static string ActionLinkSpan( this HtmlHelper helper, string linkText, string actionName, string controllerName, object htmlAttributes ) { TagBuilder spanBuilder = new TagBuilder( "span" ); spanBuilder.InnerHtml = linkText; return BuildNestedAnchor( spanBuilder.ToString(), string.Format( "/{0}/{1}", controllerName, actionName ), htmlAttributes ); } private static string BuildNestedAnchor( string innerHtml, string url, object htmlAttributes ) { TagBuilder anchorBuilder = new TagBuilder( "a" ); anchorBuilder.Attributes.Add( "href", url ); anchorBuilder.MergeAttributes( new ParameterDictionary( htmlAttributes ) ); anchorBuilder.InnerHtml = innerHtml; return anchorBuilder.ToString(); }
Basta usar Url.Action
vez de Html.ActionLink
:
">Span text
Aqui está uma solução (baixa e suja) no caso de você precisar usar ajax ou algum recurso que você não pode usar ao fazer o link manualmente (usando tag):
<%= Html.ActionLink("LinkTextToken", "ActionName", "ControllerName").ToHtmlString().Replace("LinkTextToken", "Refresh ")%>
Você pode usar qualquer texto em vez de ‘LinkTextToken’, ele está lá apenas para ser substituído, só é importante que ele não ocorra em nenhum outro lugar dentro do actionlink.
Isso sempre funcionou bem para mim. Não é confuso e muito limpo.
Acabei com um método de extensão personalizado. Vale a pena notar, ao tentar colocar HTML dentro de um object Âncora, o texto do link pode estar à esquerda ou à direita do HTML interno. Por esse motivo, optei por fornecer parâmetros para HTML interno à esquerda e à direita – o texto do link está no meio. O HTML interno esquerdo e direito é opcional.
Método de extensão ActionLinkInnerHtml:
public static MvcHtmlString ActionLinkInnerHtml(this HtmlHelper helper, string linkText, string actionName, string controllerName, RouteValueDictionary routeValues = null, IDictionary htmlAttributes = null, string leftInnerHtml = null, string rightInnerHtml = null) { // CONSTRUCT THE URL var urlHelper = new UrlHelper(helper.ViewContext.RequestContext); var url = urlHelper.Action(actionName: actionName, controllerName: controllerName, routeValues: routeValues); // CREATE AN ANCHOR TAG BUILDER var builder = new TagBuilder("a"); builder.InnerHtml = string.Format("{0}{1}{2}", leftInnerHtml, linkText, rightInnerHtml); builder.MergeAttribute(key: "href", value: url); // ADD HTML ATTRIBUTES builder.MergeAttributes(htmlAttributes, replaceExisting: true); // BUILD THE STRING AND RETURN IT var mvcHtmlString = MvcHtmlString.Create(builder.ToString()); return mvcHtmlString; }
Exemplo de Uso:
Aqui está um exemplo de uso. Para este exemplo, eu só queria o html interno no lado direito do texto do link …
@Html.ActionLinkInnerHtml( linkText: "Hello World" , actionName: "SomethingOtherThanIndex" , controllerName: "SomethingOtherThanHome" , rightInnerHtml: "" )
Resultados:
isso resulta no seguinte HTML …
Hello World
Eu pensei que isso poderia ser útil ao usar bootstrap e alguns glipons:
"> Download
Isso mostrará uma tag A, com um link para um controlador, com um belo ícone de clipe de papel para representar um link de download, e a saída em html será mantida limpa
Aqui está uma grande expansão da resposta do @tvanfosson. Eu fui inspirado por ele e decidi torná-lo mais genérico.
public static MvcHtmlString NestedActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, object routeValues = null, object htmlAttributes = null, RouteValueDictionary childElements = null) { var htmlAttributesDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); if (childElements != null) { var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext); var anchorTag = new TagBuilder("a"); anchorTag.MergeAttribute("href", routeValues == null ? urlHelper.Action(actionName, controllerName) : urlHelper.Action(actionName, controllerName, routeValues)); anchorTag.MergeAttributes(htmlAttributesDictionary); TagBuilder childTag = null; if (childElements != null) { foreach (var childElement in childElements) { childTag = new TagBuilder(childElement.Key.Split('|')[0]); object elementAttributes; childElements.TryGetValue(childElement.Key, out elementAttributes); var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(elementAttributes); foreach (var attribute in attributes) { switch (attribute.Key) { case "@class": childTag.AddCssClass(attribute.Value.ToString()); break; case "InnerText": childTag.SetInnerText(attribute.Value.ToString()); break; default: childTag.MergeAttribute(attribute.Key, attribute.Value.ToString()); break; } } childTag.ToString(TagRenderMode.SelfClosing); if (childTag != null) anchorTag.InnerHtml += childTag.ToString(); } } return MvcHtmlString.Create(anchorTag.ToString(TagRenderMode.Normal)); } else { return htmlHelper.ActionLink(linkText, actionName, controllerName, routeValues, htmlAttributesDictionary); } }
É muito simples.
Se você quiser ter algo como um ícone de glifo e depois “Lista de desejos”,
@Html.ActionLink("Wish List (0)", "Index", "Home")
Minha solução usando componentes de bootstrap:
Reset Password
Por favor, tente abaixo Código que pode ajudá-lo.
@Html.ActionLink(" SignIn", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" ,**@class="glyphicon glyphicon-log-in"** })