2010-02-23 61 views
0

我正在構建一個網站,我需要能夠在每個頁面上通知用戶。該函數看起來很像StackOverflow正在使用的,頂部是黃色(橙色?)邊框。我不想在我所有的行爲中重現這個邏輯。幹。ASP.NET MVC在操作之間共享邏輯

我在考慮使用動作過濾器,但由於我需要查詢我的數據層,它似乎不是解決它的最佳方法。

因此,例如,在每個頁面上實現諸如「您在X天期間有獎金結束的問題」這樣的特徵的最佳方式是什麼?

回答

1

在ASP.NET MVC 2中有Html.RenderAction。對於ASP.NET MVC 1.0,如果我記得正確的話,在MvcContrib中有相同的功能。

+0

謝謝,這似乎正是我要找的。 – alexn 2010-02-23 19:28:01

+0

這使它。謝謝。 – alexn 2010-02-26 15:01:40

0

我會使用TempData存儲消息,添加一個幫助器來呈現消息(如果有的話),然後在您的母版頁中使用它。這基本上就是Rails如何實現的,我一直覺得缺乏通知系統(比如flash)是ASP.net MVC中的一個奇怪的缺陷,只是因爲它很容易做到。

+0

是的,但哪裏會運行實際的邏輯?我不想在每個Action方法上執行此操作。 – alexn 2010-02-23 19:26:56

1

當我有需要進行每個動作的邏輯時,需要初始化視圖數據,我在我的基本控制器的OnResultExecuting方法(在動作運行之後調用,在視圖呈現之前調用)中執行此操作(我的所有控制器繼承),其中規定對我的基本視圖的數據模型數據(從所有我認爲數據模型繼承):

public class BaseViewData 
{ 
    public string UserMessage { get; set; } 
} 

public class BaseController : Controller 
{ 
    protected override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
    ViewResult viewResult = filterContext.ActionResult as ViewResult; 
    //Only continue if action returned an ActionResult of type ViewResult, 
    //and that ViewResults ViewData is of type BaseViewData 
    if(viewResult != null && viewResult.ViewData is BaseViewData) 
    { 
     ((BaseViewData)viewResult.ViewData).UserMessage = userService.GetUserMessage(); 
    } 
    } 
}