在我的asp.net mvc Web应用程序中添加面包屑

时间:2013-11-26 17:38:37

标签: css asp.net-mvc asp.net-mvc-4 razor

我们发布了一个新的要求,为我们的asp.net mvc应用程序添加了一个痕迹,所以我在布局视图中编写了以下代码: -

  @{var controller = ViewContext.RouteData.Values["Controller"].ToString();
                  var action = ViewContext.RouteData.Values["action"].ToString();

string coutput = "";

foreach (char letter in controller)
{
   if (Char.IsUpper(letter) && coutput.Length > 0)
   { coutput += " " + letter; }
   else
   { coutput += letter; }
}
string aoutput = "";

foreach (char letter in action)
{
    if (Char.IsUpper(letter) && aoutput.Length > 0)
    { aoutput += " " + letter; }
    else
    { aoutput += letter; }
}

                  }
            <div>

                <ul class="breadcrumb">
                    <li>

                        @Html.ActionLink(coutput, "", controller)

 <span class="divider">/</span>
                    </li>
                    <li>
                         @Html.ActionLink(aoutput == "Index" ? "Home" : aoutput,action, controller)


                    </li>
                </ul>
            </div>

以上工作正常,因为它将拆分控制器名称和操作方法名称并构建vreadcrumb链接。我的方法的优点是我重复使用我目前拥有的(控制器和操作方法名称)来构建面包屑。但我的问题是,通过这种方式来定义面包屑会产生我不知道的问题吗?

谢谢

1 个答案:

答案 0 :(得分:1)

我不知道你的项目有多大,假设你有15个控制器和60个查看页面。 当您将上面的代码放在导航栏的主布局中时,在视图页面完成加载之前,它需要在视图中运行代码块,即使某些页面不需要它也是如此。 此外,保持视图紧密模型,而不是控制器。它使视图干净。

我建议你使用ActionFilterAttribute。因为它是在您想要使用它时执行的。也可以为你的情况 创建动态BreadCrumb视图,它很容易重用。下面是我编写的示例代码,我没有测试它,但它会给你一个好主意。

<强> ActionFilterAttribute

 public class BreadcrumbAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var controllerName = (string)filterContext.RouteData.Values["controller"];
            var actionName = (string)filterContext.RouteData.Values["action"];
            string coutput = Modifier(controllerName);
            string aoutput = Modifier(actionName);

            filterContext.Controller.ViewBag.displayActionName = coutput;
            filterContext.Controller.ViewBag.displayControllerName = aoutput;
            filterContext.Controller.ViewBag.ActionName = actionName;
            filterContext.Controller.ViewBag.ControllerName = controllerName;
        }

        private string Modifier(string str)
        {
            string output = "";
            foreach (char letter in str)
            {
                if (Char.IsUpper(letter) && output.Length > 0)
                { output += " " + letter; }
                else
                { output += letter; }
            }
            return output;
        }
    }

<强>控制器

[Breadcrumb]
public class YourController : Controller
{
    //
}

查看

<div>
    <ul class="breadcrumb">
        <li>
            @Html.ActionLink((string)@ViewBag.displayActionName, "", (string)@ViewBag.controllerName)
            <span class="divider">/</span>
        </li>
        <li>
            @Html.ActionLink((string)@ViewBag.displayControllerName == "Index" ? "Home" : (string)@ViewBag.displayControllerName,(string)@ViewBag.ActionName, (string)@ViewBag.ControllerName)
        </li>
    </ul>
</div>