C#MVC从部分控制器获取带有菜单项的活动菜单项 - c#

我正在mvc4中建立一个新网站,并且正在从数据库中检索动态菜单。为了防止在每个控制器和视图中反复执行相同的操作来创建菜单,我使用带有局部视图的partialcontroller来构建菜单。感谢this文章,我已经做到了。

我要实现的下一件事是根据当前的控制器和操作来确定当前的活动菜单项,因此,我创建了一个HTML帮助器来执行此操作。该代码基于this article。

我的代码看起来像这样;

Partialcontroller.cs

[ChildActionOnly]
        public ActionResult MainMenu()
        {
            var viewModel = new MenuModel();

            try
            {
                IList<MenuItem> menuItems = MenuService.First(x => x.Name == "MainMenu").MenuItems;

                //Get the menuItems collection from somewhere
                if (menuItems != null && menuItems.Count > 0)
                {
                    viewModel.MenuItems = menuItems;
                    return View(viewModel);
                }
            }
            catch (Exception exception)
            {
                //TODO: Exception handling and logging
            }

            return View(viewModel);
        }

MainMenu.cshtml

这是包含在布局中的局部视图,并且其中包含这段代码。

<nav class="nav-collapse collapse">
    <ul class="row-fluid nav">
        @foreach (var item in Model.MenuItems)
        {
            <li class="span2">
                @Html.MenuItem(item.Name, item.ActionName, item.ControllerName)
            </li>
        }

    </ul>
</nav>

HtmlHelper.cs

我在部分视图中用于构建菜单项的htmlhelper方法。这就是问题所在。

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 = "active"
                    });
            }

            //var link = htmlHelper.ActionLink("<span>{LinkText}<span>", actionName, controllerName).ToHtmlString();
            //return new MvcHtmlString(link.Replace("{LinkText}", linkText));

            return htmlHelper.ActionLink(linkText, actionName, controllerName);
        }

调试时,我看到变量“ currentController”包含值“ Partial”,变量“ currentAction”包含“ MainMenu”。在我看来,一切都非常合理,因为这是用于构建菜单的控制器操作。
但是,这也是问题。这两个变量将始终包含值'Partial'和'MainMenu',因为MenuItem帮助器始终在PartialController实例化的视图中调用。这样,我永远无法匹配发出请求的实际控制器。

我要做的就是,例如,单击菜单中的联系人按钮,并将其视为活动菜单项。该菜单项的动作可以是ContactController的Index动作,因此,如果控制器和动作与控制器匹配,并且动作与菜单项映射,则应添加一个附加的css类。

我该怎么解决?我更喜欢用代码而不是肮脏的javascript函数来执行此操作,但是我不知道这是否可行或如何执行?

参考方案

我认为您可以使用htmlHelper.ViewContext上的ParentActionViewContext属性访问父控制器

string currentController = htmlHelper.ViewContext.ParentActionViewContext.RouteData.GetRequiredString("controller");

ASP.NET MVC 5自定义登录,无需脚手架,数据库优先 - c#

我对asp.net和mvc还是很陌生,所以我正在努力学习尽可能多的知识...为此,我从头开始编写博客网站,但是我对身份验证和授权有些困惑。由于我倾向于不真正使用任何脚手架的东西,所以我首先要使用数据库,所以不希望asp.net身份为我创建表。我对散列和加盐密码很酷,并对照数据库检查用户,我遇到的麻烦是将用户设置为登录状态并检查他们应该能够访问什么。我真的很想…

ASP.NET-如何更改JSON序列化的方式? - javascript

我正在使用ASP.NET通过以下查询返回Json文件:public ActionResult getTransactionTotals(int itemID) { DBEntities db = new DBEntities(); var query = from trans in db.Transactions // Linq query removed …

Asp.Net:在服务器端还原DropDownList的客户端SelectedItem - c#

因此,我的页面上有一个dropDownList,其中包含数百个项目。用户可以通过在文本框中键入一些文本来过滤此DDL。然后对DDL进行相应的过滤(所有不包含输入文本的项目都将通过JavaScript删除)。然后,用户选择他的项目并按下按钮。通常,这将导致错误,因为DDL已更改并且ASP验证了PostBack数据。但是,使用EnableEventValidat…

asp.net:treeview-显示文本框是否选中? - c#

我需要向用户显示字符串列表。用户可以选择多个字符串。如果选择了一组特定的字符串,则每个字符串旁边都会出现一个文本框。我想做的是向用户显示一个TREEVIEW,每个节点都是字符串之一。他们将通过选中复选框来选择所需的每个字符串。问题:如果用户选择特定的复选框,则我需要一个文本框来显示用户的GET输入。问题:如何从用户使用树形视图获取字符串输入? 参考方案 Tr…

ASP.NET-如何检测MAC用户 - c#

我正在尝试使用c#检测MAC用户。我已经使用了以下代码,但是当Mac用户导航到我的网站时,它始终显示未知。它非常适合Windows用户,但不适用于MAC或其他任何工具。有没有人有任何想法如何选择Mac用户?谢谢 HttpBrowserCapabilities moo = HttpContext.Current.Request.Browser; StringB…