2013-03-11 21 views
0

我來自「常規」聊天室,所以我有點(完全)與MVC迷路。如何在ASP.net MVC 4 webapp的每個頁面請求中共享一個公共對象?

我用我自己的asp.net programmation模式做什麼:

  • 我有一個自定義類客體代表的「頁」和它的屬性(如mypage.loadJquery,mypage.isLogged,我的空間。標題,自定義緩存邏輯等)
  • 這個類在每個ASHX頁面上都有一個instanciate,然後操作一個stringbuilder來生成HTML,並在瀏覽器末尾吐出它。
    • 具有ASHX頁面上只有一個要求,我可以在調用最後的Response.Write

現在,當我試圖去MVC使用頂部,直到結束我的實例化對象頁。我「有點」瞭解M/V/C模型和路由概念。我想保留我的自定義「頁面」對象,但我失去了我的頁面生命週期,而且我絕對不知道如何在每次調用的頂部實例化頁面對象。

我需要通過每一個模型,控制器,視圖,局部視圖,這的HtmlHelper ONCE實例化共享對象...

我實現MVC模式可能在這一刻被混淆對我來說,BU我怎麼可能嘗試重現我的需要? (非常具體的例子:在每個請求中,我需要檢查用戶是否通過他的cookie進行了記錄,如果是我往返數據庫以獲取用戶信息,那麼我確實需要這些信息在每個模型/控制器上/視圖的應用程序,但當然不希望每次回到安全檢查和數據庫查詢,我怎麼能在整個mvc cyle這些信息?)

回答

0

在我的項目,我創建界面IViewModel包含我需要在我的佈局/母版的所有領域,並設置是作爲它的模式,使我可以容易使用:

IViewModel.cs

public interface IViewModel 
{ 
    string Title { get; set; } 

    User User { get; set; } 
} 

Layout.cshtml

@model IViewModel 

<html> 
    <head> 
     <title>@Model.Title</title> 
    </head> 
    <body> 
     @if (Model.User.IsAuthenticated) { 
      You are logged as @Model.User.Name 
     } 
    </body> 
</html> 

我所有的模型都實現了該接口(或繼承自該類的默認實現的ViewModelBase)。此外,我有自定義操作篩選器,檢查返回的ActionResult是否(部分)ViewResult,如果它的模型實現我的界面並填充該界面中的數據。

public FillViewModelAttribute : ActionFilterAttribute 
{ 
    public override OnActionExecuted(ActionExecutedContext context) 
    { 
     var viewResult = context.Result as ViewResult; 
     if (viewResult != null && viewResult.Model is IViewModel) 
     { 
      var viewModel = (IViewModel)viewResult.Model; 
      // fill data 
     } 
    } 
} 
+0

有趣的方法 – 2013-03-11 19:01:26

+0

如果我理解的很好,只能將一個模型傳遞給VIEW,那麼如何將您所說的「客戶」模型傳遞給您已經實現了默認IViewModel的視圖模型?必須將客戶模型放入視圖包中?它不會破壞這個概念嗎? – 2013-03-11 19:50:28

+0

您可以創建類似ViewModelBase 的東西,其中包含屬性'Model'或創建'CustomerViewModel',實現'IViewModel',包含客戶數據和其他附加數據。爲下拉菜單。 – 2013-03-11 20:00:50

0

我創建了許多像這樣的項目。基本上,您可以創建一個基本控制器類,其中所有其他控制器都從其繼承。

[Authorize] 
public class BaseController : Controller 
{ 

    private Instructor _G_USER = null; 

    protected Instructor G_USER 
    { 
     get 
     { 
      if (_G_USER == null) 
      { 
       _G_USER = Your DB query here 
       ViewData["G_USER"] = _G_USER; 

      } 
      return _G_USER; 
     } 
    } 
} 

然後在你的每一個子類,你可以做

[Authorize] 
public class YourController : BaseController 
{ 
    public ActionResult Index() 
    { 
     if(!G_USER.CAN_DO_THIS) throw new NoPermissionException(); 

     return View(); 
    } 
} 

要使用用戶在視圖中創建一個擴展方法。

public static class ExtentionMethods 
{ 
    public static USER G_USER(this ViewPage page) 
    {    
     return (USER)page.ViewData["G_USER"]; 
    } 
} 

然後在頁面中使用這樣

<%=this.G_USER().....%> 
+0

好的開始,但用戶數據通過ViewData傳遞而不是Model。這可能是可以接受的,我必須測試它。 – 2013-03-11 19:57:39

+0

爲了更有創意,使用擴展方法 – 2013-03-11 20:24:09

相關問題