2011-03-22 100 views
2

我是ASP.net MVC的新手,我想使用一個視圖,但使用不同的母版頁,具體取決於用戶角色使用不同母版頁的相同視圖 - ASP.NET MVC

現在,我扶着使用一個控制器誰返回視圖1如果用戶在role1上視圖2role2所查看1查看2包含內部相同的部分視圖,以呈現由兩者共享但具有不同母版頁的內容。

我想知道這是一種好的做法還是推薦其他設計。我的解決方案似乎有點複雜,要做一些簡單的事情。也許我失去了一些東西

謝謝!

回答

6

你可以有它返回基於用戶角色的主名稱的函數,然後寫一個自定義的行爲過濾器,將動作後執行,並設置基於當前連接的用戶角色對應的母版頁:

public class MasterChooserAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     base.OnActionExecuted(filterContext); 
     var result = filterContext.Result as ViewResult; 
     if (result != null) 
     { 
      var user = filterContext.HttpContext.User; 
      result.MasterName = GetMaster(user); 
     } 
    } 

    private string GetMaster(IPrincipal user) 
    { 
     // TODO: based on the current user roles return the proper master page 
     throw new NotImplementedException(); 
    } 
} 

然後用這個動作過濾器簡單地裝飾你的基礎控制器,或者如果這是一個ASP.NET MVC 3應用程序,只需聲明它爲global filter

+0

似乎lika一個好主意,我不知道很多關於動作過濾器,但我會去讀這個主題。 Hany好鏈接? – Mathieu 2011-03-22 18:12:50

+0

正在做_Layout = SomeStaticClass.GetMasterNameBasedonUser();不會工作?爲什麼這麼複雜 – Omu 2011-03-22 18:13:12

+0

@Mathieu,是的,這裏是一個:http://www.asp.net/mvc/tutorials/understanding-action-filters-cs – 2011-03-22 18:13:37

0

如果你想出第三個角色會發生什麼?第四個角色?不要在控制器中放入這種邏輯,如果主頁面根據其角色顯示不同的內容會怎樣?你可以隱藏整個大塊<div>或什麼都不在主人。然後,只要角色依賴關係發生變化,您就只有一個地方可以更改它。主頁面是基於角色的不同?

+0

是的,他們是真的不同 – Mathieu 2011-03-22 18:11:29

0

在你的控制器做

this.ViewBag.Layout = something 

在你看來

Layout = this.ViewBag.Layout 
0

只需選擇您的視圖佈局。 可以動態改變@ {佈局= XXX}在MVC 3 見:http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx

你的控制器可以檢查的角色,並分配被使用的佈局,然後被分配到@Layout在您的視圖,但你你同樣可以保持這個代碼在你看來,以確定使用的佈局,因爲畢竟這是「視圖邏輯」

+0

好吧,我現在仍然在使用asp.net mvc2。 Razor的佈局是什麼? – Mathieu 2011-03-22 18:19:49

+0

是的 - 只適用於剃刀。如果可以的話,升級 - 它非常值得。 – 2011-03-22 19:12:41

1

有多種方法可以選擇各有其優點母版頁。

最簡單的很可能是使用控制器查看方法

public ViewResult Index() { 

    var masterName = getMasterPageNameForUser(); //get you master page/layout name here 

    return View("Index", masterName, model); 

} 

然而,這會導致一些重複的代碼返回主網頁的名稱,這樣的替代可能是創建一個自定義IViewEngine並設置主名稱那裏。 Scott Hanselman's postthis coder journal post會給你一個如何創建自定義視圖引擎的想法。從那裏可以設置主名稱。

相關問題