我有两个问题:
Html.ActionLink()
时如何显示无链接文本(实际上,这是Site.Master
)。 没有重载版本不允许链接文本,当我尝试只传入一个空白string
时,编译器告诉我它需要一个非空字符串。
我该如何解决这个问题?
我需要在锚标记中添加<span>
标记,但它不能与Html.ActionLink();
一起使用。我想看看以下输出:
跨度文本
醇>
如何在ASP.NET MVC中将标记放在锚标记内?
答案 0 :(得分:310)
您可以通过Url.Action
渲染网址,而不是使用Html.ActionLink<a href="<%= Url.Action("Index", "Home") %>"><span>Text</span></a>
<a href="@Url.Action("Index", "Home")"><span>Text</span></a>
要做一个空白网址,你可以
<a href="<%= Url.Action("Index", "Home") %>"></a>
<a href="@Url.Action("Index", "Home")"></a>
答案 1 :(得分:17)
自定义HtmlHelper扩展是另一种选择。 注意:ParameterDictionary是我自己的类型。您可以替换RouteValueDictionary,但您必须以不同方式构造它。
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();
}
答案 2 :(得分:12)
只需使用Url.Action
代替Html.ActionLink
:
<li id="home_nav"><a href="<%= Url.Action("ActionName") %>"><span>Span text</span></a></li>
答案 3 :(得分:12)
这是(低和脏)解决方法,以防您需要使用ajax或手动链接时使用的某些功能(使用标记):
<%= Html.ActionLink("LinkTextToken", "ActionName", "ControllerName").ToHtmlString().Replace("LinkTextToken", "Refresh <span class='large sprite refresh'></span>")%>
你可以使用任何文本而不是'LinkTextToken',它只是被替换,重要的是它不会发生在actionlink内的任何其他地方。
答案 4 :(得分:6)
这一直对我有用。它并不凌乱而且非常干净。
<a href="@Url.Action("Index", "Home")"><span>Text</span></a>
答案 5 :(得分:2)
我最终得到了一个自定义扩展方法。值得注意的是,当尝试将HTML放在Anchor对象中时,链接文本可以位于内部HTML的左侧或右侧。出于这个原因,我选择为左右内部HTML提供参数 - 链接文本位于中间。左右内部HTML都是可选的。
扩展方法ActionLinkInnerHtml:
public static MvcHtmlString ActionLinkInnerHtml(this HtmlHelper helper, string linkText, string actionName, string controllerName, RouteValueDictionary routeValues = null, IDictionary<string, object> 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;
}
使用示例:
以下是使用示例。对于这个例子,我只想要链接文本右侧的内部html ...
@Html.ActionLinkInnerHtml(
linkText: "Hello World"
, actionName: "SomethingOtherThanIndex"
, controllerName: "SomethingOtherThanHome"
, rightInnerHtml: "<span class=\"caret\" />"
)
<强>结果:强>
这导致以下HTML ...
<a href="/SomethingOtherThanHome/SomethingOtherThanIndex">Hello World<span class="caret" /></a>
答案 6 :(得分:1)
我认为在使用bootstrap和一些glypicons时这可能很有用:
<a class="btn btn-primary"
href="<%: Url.Action("Download File", "Download",
new { id = msg.Id, distributorId = msg.DistributorId }) %>">
Download
<span class="glyphicon glyphicon-paperclip"></span>
</a>
这将显示一个A标签,带有一个指向控制器的链接,上面有一个漂亮的回形针图标代表下载链接,并且html输出保持清洁
答案 7 :(得分:1)
这是@ tvanfosson答案的超级扩展。我受到它的启发,并决定使它更通用。
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);
}
}
答案 8 :(得分:0)
这很简单。
如果你想要一个像glyphicon图标,然后是“愿望清单”,
<span class="glyphicon-heart"></span> @Html.ActionLink("Wish List (0)", "Index", "Home")
答案 9 :(得分:0)
请尝试以下可能对您有用的代码。
@Html.ActionLink(" SignIn", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" ,**@class="glyphicon glyphicon-log-in"** })
答案 10 :(得分:0)
我使用bootstrap组件的解决方案:
<a class="btn btn-primary" href="@Url.Action("resetpassword", "Account")">
<span class="glyphicon glyphicon-user"></span> Reset Password
</a>