道歉,我是ASP.NET MVC的新手。 :)
我不确定这是一个简单的误解,还是用于此类功能的不正确的范例,但这是我到目前为止所提出的......
当我们检测到用户与其href位于同一页面时,我希望提供将常用功能添加到锚标记的css属性(在本例中为“active”)。在MVC(特别是我的应用程序)的上下文中,我将其解释为“当前活动控制器与超链接的目标位置相同时。”
好!所以。我在哪里使用代码?
我已经实现了以下Html帮助扩展,以帮助从我需要的标准链接创建稍微“调整”。
public static MvcHtmlString ActiveActionLink (this HtmlHelper helper, string labelText, string action, string controller)
{
var cssProprties = controller + " active";
return helper.ActionLink(labelText, action, controller, null, new { @class = cssProprties });
}
目前你可以看到我正在应用两个css类。第一个是控制器的名称,这很好。后来,我没有逻辑,只需添加活动的css类。这就是我一直试图将逻辑添加到。
我的理论是,我需要做的就是挖掘正确的对象以找到我当前所在的控制器,并将其与传入的“controller”参数相匹配。如果这些匹配,则添加活动类。
所以,在两个问题......
这是在ASP.NET mvc中“思考”的正确/可接受的方式吗?
如果是这样的话:我可以从我所在的级别挖掘哪些对象来访问我需要的信息进行比较?
更新
当我在SO上写一个问题时,通常会发生什么事情,我有一个脑电波。我注意到BeginForm帮助器中的一个代码块,引导我创建这个例子:
public static MvcHtmlString ActiveActionLink (this HtmlHelper helper, string labelText, string action, string controller)
{
var cssProprties = controller;
// if this controller is the target controller, page is active.
if (helper.ViewContext.RouteData.Values["controller"].ToString() == controller)
cssProprties += " active";
return helper.ActionLink(labelText, action, controller, null, new { @class = cssProprties });
}
所以我猜这回答了“我可以挖掘哪些物体?”题。此外,这直接受到MVC来源的影响 - 可能是“这是在ASP.NET mvc中这是”正确/可接受的“思考方式吗?”问题呢?
答案 0 :(得分:0)
这似乎是一种正确的方法,尽管有一些事情你需要考虑考虑。
如果通过Html.Action或Html.RenderAction呈现链接,则ViewContext将引用子操作所在的控制器,这可能是您想要的,也可能不是。如果您希望它引用主页面的控制器,您可能还需要对ViewContext.ParentActionViewContext进行递归检查(继续调用parent,直到它为null然后获取控制器)。
其次,有些区域,如果它们位于不同的区域,你可以拥有相同名称的控制器,所以我建议使用第二个帮助器,它接受一个区域字符串并检查它和控制器。
答案 1 :(得分:0)
这是我决定解决的代码。它解决了我遇到的问题&直接受到asp.net mvc2源代码的影响。我希望它也有助于其他人。
public static MvcHtmlString ActiveActionLink (this HtmlHelper helper, string labelText, string action, string controller)
{
var cssProprties = controller;
// if this controller is the target controller, page is active.
if (helper.ViewContext.RouteData.Values["controller"].ToString() == controller)
cssProprties += " active";
return helper.ActionLink(labelText, action, controller, null, new { @class = cssProprties });
}