Asp.net 最好的标记方式是;“当前”;菜单中的导航项
例如,在StackOverflow中,您可以使用带有选项的顶部菜单:问题,标签,用户,徽章,未回答和提问。当您处于其中一个部分时,它将以橙色高亮显示 在ASP.NET MVC中实现这一点的最佳方法是什么 到目前为止,作为概念证明,我已经完成了以下工作:Asp.net 最好的标记方式是;“当前”;菜单中的导航项,asp.net,asp.net-mvc,asp.net-mvc-3,navigation,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Navigation,例如,在StackOverflow中,您可以使用带有选项的顶部菜单:问题,标签,用户,徽章,未回答和提问。当您处于其中一个部分时,它将以橙色高亮显示 在ASP.NET MVC中实现这一点的最佳方法是什么 到目前为止,作为概念证明,我已经完成了以下工作: public static String IsCurrentUrl(this UrlHelper url, String generatedUrl, String output) { var requestedUr
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”属性,第二次调用helper,我认为必须有更好的方法来实现这一点。第二个问题,这不是比较两个链接的最佳方法。我想我可以创建一个新的Html.ActionLink
重载,这样我就不需要调用Url.Action
两次,但是有什么内置方法可以做到这一点吗
奖励:如果我在“上添加了”class=\,MVC将在“
上呈现class=”“。为什么?
问候。不确定第一位,但为了奖金:
\是C#(以及大多数语言中的转义字符),它将导致下一个字符被解释为字符串,而不是C#运算符。使用CSS执行此操作。在服务器上,创建一个函数来标识应高亮显示的站点部分,并将其作为css类输出到body标记中:
本文对此进行了解释:
对于我正在进行的一个项目,我们遇到了完全相同的问题。如何突出显示当前选项卡?这是当时采取的方法:
在母版页视图中:
<%
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>
基本上,我们只是将动作和控制器值与链接相关的值进行字符串比较。如果它们匹配,那么我们调用当前链接,并为菜单项分配一个“当前”类
到目前为止,这是可行的,但随着我们的规模越来越大,这个设置开始变得相当大,有很多“或”这个“或”那个。所以,如果你决定试试这个,请记住这一点
祝你好运,希望这对你有所帮助。另一种方法是使用这样的扩展方法(示例中是Razor和C):
方法:
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);
}
对,但那正是我想要的。如果您在HTML代码中看到,我正在用C#调用一个函数,我想将字符串class=“on”
作为参数传递,因此我使用“class=\”on\”
,它应该返回该字符串,但不是。如果它在您的Razor视图中,语义视图引擎不应该要求转义字符,除非它特别在C#函数中。您是否考虑过使用内置的SiteMap功能来管理活动导航节点?“创建一个函数来标识应该突出显示的站点部分”,很好:D这就是我要找的,该函数为:D
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);
}