2010-02-23 28 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(); 
    } 
    } 
}