例如,在StackOverflow中,您可以选择一个顶部菜单,其中包含以下选项:问题,标记,用户,徽章,未答复和提问。当您在其中一个部分中时,它会以橙色突出显示。
在ASP.NET MVC中实现这一目标的最佳方法是什么?
到目前为止,作为概念证明,我已经完成了这个帮助:
public static String IsCurrentUrl(this UrlHelper url, String generatedUrl, String output)
{
var requestedUrl = url.RequestContext.HttpContext.Request.Url;
if (generatedUrl.EndsWith("/") && !requestedUrl.AbsolutePath.EndsWith("/"))
generatedUrl=generatedUrl.Substring(0, generatedUrl.Length - 1);
if (requestedUrl.AbsolutePath.EndsWith(generatedUrl))
return output;
return String.Empty;
}
如果当前请求与该链接匹配,则该方法将输出字符串添加到元素。所以它可以像这样使用:
<li>
<a href="@Url.Action("AboutUs","Home")" @Url.IsCurrentUrl(@Url.Action("AboutUs", "Home"), "class=on")><span class="bullet">About Us</span></a>
</li>
第一个问题,我基本上是两次调用Url.Action
,首先调用“href”属性,然后调用帮助器,我认为必须有更好的方法来执行此操作。第二个问题,这不是比较两个链接的最佳方法。我想我可以创建一个新的Html.ActionLink
重载,所以我不需要两次调用Url.Action
,但有没有任何构建方法可以做到这一点?
奖励:如果我添加"class=\"on\""
,MVC会呈现class=""on""
。为什么呢?
问候。
答案 0 :(得分:2)
对于我正在进行的项目,我们遇到了完全相同的问题。如何突出显示当前标签?这是当时采取的方法:
在母版页视图中:
<%
var requestActionName =
ViewContext.RouteData.Values["action"].ToString();
var requestControllerName =
ViewContext.RouteData.Values["controller"].ToString();
%>
<li class="<%= requestActionName.Equals("Index",
StringComparison.OrdinalIgnoreCase)
&& requestControllerName.Equals("Home",
StringComparison.OrdinalIgnoreCase) ?
"current" : string.Empty %>">
<%: Html.ActionLink("Home", "Index", "Home") %>
</li>
基本上发生的事情是,我们只是将动作和控制器值与链接相关的值进行字符串比较。如果匹配,那么我们就会调用当前链接,然后我们分配一个“当前”链接。菜单项的类。
现在到目前为止,这是有效的,但随着我们的规模变得越来越大,这个设置开始变得相当大,有很多&#39;或者&#39;这个&#39;或&#39;那。所以,如果你决定尝试这个,请保持这种想法。
祝你好运,希望这会帮助你解决一些问题。答案 1 :(得分:1)
使用CSS做。在服务器上,创建一个函数来标识应突出显示的站点部分,并将其作为css类输出到body标签中:
这篇文章解释了它: http://hicksdesign.co.uk/journal/highlighting-current-page-with-css
答案 2 :(得分:1)
另一种方法是使用这样的扩展方法(示例中为Razor和C#):
@Html.MenuItem("MainPage","Index", "Home")
方法:
public static MvcHtmlString MenuItem(
this HtmlHelper htmlHelper,
string linkText,
string actionName,
string controllerName
)
{
string currentAction = htmlHelper.ViewContext.RouteData.GetRequiredString("action");
string currentController = htmlHelper.ViewContext.RouteData.GetRequiredString("controller");
if (actionName == currentAction && controllerName == currentController)
{
return htmlHelper.ActionLink(
linkText,
actionName,
controllerName,
null,
new
{
@class = "current"
});
}
return htmlHelper.ActionLink(linkText, actionName, controllerName);
}
答案 3 :(得分:0)
不确定第一位,但奖励:
\是C#中的转义字符(对于大多数语言而言),它将导致下一个字符被解释为字符串,而不是C#运算符。