2013-11-26 44 views
-2

了一項新要求發給麪包屑添加到我們的asp.net的MVC應用程序,我們,所以我寫了我們的佈局圖中下面的代碼: -添加麪包屑到我的asp.net MVC Web應用程序

@{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

我會建議你使用ActionFilterAttribute。 – Lin

+0

您要求我們進行代碼審查? – Sinaesthetic

+0

@林和如何在我的情況下使用ActionFilter? –

回答

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> 
相關問題