我正在给MVC另一个镜头,我觉得我正在重新学习HTML格式。
所以,愚蠢的问题:在我的母版页的顶部,我有一个局部视图(或类似的 - 我正在使用string template view engine,到目前为止我爱它)或者显示一个小的登录表单(类似于NewEgg的表单),或者像
这样的消息您已登录为(姓名)。 [简介] | [退出]
不幸的是,我有一个大脑抽筋,无法确定将数据(用户名,id)放入ViewData集合的最佳方法,而无需在每个控制器方法中明确指定它,例如
public ActionResult Index()
{
ViewData["IsAuthenticated"] = Session["IsAuthenticated"];
ViewData["user.firstname"] = User.FirstName;
return View("login");
}
必须在整个地方进行复制,这非常烦人。我的下一个选择是创建一个名为PopulateCommonViewData()的方法,并从每个操作方法中调用它,但这看起来也很糟糕。
我在这里错过了什么吗?
答案 0 :(得分:5)
从基本控制器派生您的控制器。然后将创建公共视图数据的方法移动到该基本控制器中的OnActionExecuting / OnActionExecuted覆盖。
public class BaseController : Controller
{
public override void OnActionExecuting( ActionExecutingContext filterContext )
{
ViewData["IsAuthenticated"] = Request.IsAuthenticated;
ViewData["user.firstname"] = User.FirstName;
}
}
public class MyController : BaseController // and you're done
{
...
}
答案 1 :(得分:1)
我会使用ASP.NET成员资格,只需检查状态并从母版页中的页面上下文方法中获取信息。做得简单!
答案 2 :(得分:1)
我的头脑中有几个选项,使用所有控制器继承的公共基本控制器,在OnActionExecuting方法/覆盖中添加信息,或者如果不是,则可以使用动作过滤器需要全球......
答案 3 :(得分:1)
如何使用IUserContext&注入注入的基本ViewModel类?应用程序中的所有其他ViewModel都派生自此ViewModel?
不知何故,我对做的概念不满意:ViewData [“magic_string”] =“magic”;这里推荐的模式......
也许我错过了一个观点。很想知道什么?
HTH
答案 4 :(得分:0)
不要将这些数据放在ViewData或模型中,并将其存储在静态属性中。这些静态属性可以包装会话或应用程序状态,ASP.NET缓存或请求上下文包,无论什么是合适的。所以你不要用这种全局性的东西弄乱你的控制器。
答案 5 :(得分:0)
我可以看到两种方法。一种方法是在执行控制器操作后使用自定义操作过滤器属性将所需数据提取到视图模型中(ActionFilterAttribute上的OnResultExecuted方法可能会执行此操作)。
另一种方法是使用基本控制器类,并在那里覆盖OnActionExecuted方法。
因为听起来你会想要在所有页面上看到这一点,所以后一种选择似乎会减少维护。