ASP.NET MVC活动菜单项,所有项目都针对相同的操作

时间:2013-04-16 07:41:47

标签: c# asp.net-mvc razor

我知道这个问题已被多次询问,但我的情况与其他情况没什么不同。 我想要实现的是,如果链接是指向当前位置的链接,则突出显示菜单项。通过突出显示我的意思是我想将一个名为current的类附加到包含该链接的<li>。 菜单在Master页面中,我通过从Home Controller的Index action方法传递菜单项列表来动态填充。

索引操作(Home Controller)

public ActionResult Index(string city, string adtype)
    {
        if (city == null)
        {
            city = "abc";
        }

        if (adtype == null)
        {
            adtype = "jobs";
        }


        using (var _db = new UPContext())
        {
            var cities = _db.Cities.ToList();
            ViewBag.cities = cities;
        }

        var model = new List<AdPost>();

        using (var _db = new UPContext())
        {
            var cat = _db.AdTypes.Where(a => a.AdTypeName == adtype).SingleOrDefault();
            var adcity = _db.Cities.Where(c => c.CityName == city).SingleOrDefault();

            if ((cat != null) && (city != null))
            {
                model = (from p in _db.Posts
                         where p.City.Id == adcity.Id &&
                         p.AdType.Id == cat.Id
                         select p).ToList();
            }

            ViewBag.adType = adtype;
            ViewBag.City = city;
        }

        return View(model);

    }

在layout.cshtml中,我使用ViewBag.cities填充菜单

@foreach (var c in ViewBag.cities)
    {

    <li> @Html.ActionLink((string)c.CityName, "Index","Home", new { city = c.CityName, adType="adtype" }, new { @class = "leftnav", data_id= c.Id })</li>
    }

我已将路由配置为

 routes.MapRoute(
            name: "CityRoute",
            url: "{city}/{adtype}/",
            defaults: new { controller = "Home", action = "Index", city = UrlParameter.Optional, adtype=UrlParameter.Optional }
            );

我在网上看到的关于突出显示当前菜单项的所有其他解决方案都使用HTML Helpers,它根据控制器和操作做出决定,但因为在我的情况下所有链接都针对相同的控制器和操作,并且彼此不同基于它们传递给方法的参数。我想知道如何突出显示当前菜单项。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以在viewbag中传递实际的城市名称:

ViewBag.currentCity = city;

在视图中的foreach检查当前城市:

@foreach (var c in ViewBag.cities)
{
    string cssClass = "leftnav";
    if(c.CityName == ViewBag.currentCity)
    {
        cssClass = "especialCurrentCityClass";
    }
    <li> @Html.ActionLink((string)c.CityName, "Index","Home", new { city = c.CityName,adType="adtype" }, new { @class = cssClass, data_id= c.Id })</li>
}

这是实际方法的最快方法,但我认为值得创建一个视图模型类来保存带有必要信息的菜单项来绘制整个菜单,这样就可以保持视图的清洁。