ASP.NET MVC在动作之间共享逻辑

时间:2010-02-23 19:08:57

标签: c# asp.net-mvc

我正在构建一个网站,我需要能够在每个页面上通知用户。该函数看起来很像StackOverflow正在使用的东西,顶部是黄色(橙色?)边框。我不想在我的所有动作中重现这个逻辑。 DRY。

我正在考虑使用动作过滤器,但由于我需要查询我的数据层,因此它似乎不是解决它的最佳方法。

那么,例如,在每个页面上实施诸如“你有一个以X天结束的赏金的问题”这样的特征的最佳方式是什么?

3 个答案:

答案 0 :(得分:1)

在ASP.NET MVC 2中有Html.RenderAction。对于ASP.NET MVC 1.0,如果我没记错,MvcContrib中有相同的功能。

答案 1 :(得分: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();
     }
  }
}

答案 2 :(得分:0)

我会使用TempData存储消息,添加一个帮助器来呈现消息(如果有的话),然后在主页面中使用它。这基本上就是rails的做法,我一直认为缺少通知系统(如flash)是ASP.net MVC的一个奇怪的差距,只是因为它很容易做到。

相关问题