我们发布了一个新的要求,为我们的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链接。我的方法的优点是我重复使用我目前拥有的(控制器和操作方法名称)来构建面包屑。但我的问题是,通过这种方式来定义面包屑会产生我不知道的问题吗?
谢谢
答案 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>