我有一个独特的场景,我希望基本控制器获取一些数据并将其存储在列表中。该列表应该像ViewData一样可以从我的视图中访问。我将在每个页面上使用此列表,并且想要一个更清晰的解决方案,而不仅仅是在ViewDataDictionary中推送它。
在尝试提出解决方案之后,我想我会创建一个带有属性的自定义ViewPage来保存我的列表。我的自定义ViewPage将继承自System.Web.MVC.ViewPage。但是,我不知道MVC将viewdata从控制器传递到视图的位置。更重要的是,如何让我将列表传递给视图?
感谢您的帮助。
编辑...
很抱歉这个混乱。我试图让问题尽可能简单,以避免任何混淆。显然,这不起作用:))
我正在.net mvc项目中实现自己的会话管理。当请求进入时,我的基本控制器检查会话cookie是否与OnActionExecuting方法中的请求一起发送。如果发送了会话cookie,我的控制器将访问数据库并检索用户的会话信息。会话信息(userid等)被放入List对象并存储在名为“Sess”的属性中。
我希望能够从我的视图中访问Sess列表中的元素,如下所示:
那么,我如何以及在哪里让我的控制器将Sess列表移交给我的观点?
我意识到这不是通常在.net中实现自定义会话管理的方式。但是,这对我的项目来说是最简单,最干净的解决方案。
感谢迄今为止帮助过的所有人!
答案 0 :(得分:2)
一般情况下,我建议明确说明您的观点可以访问的内容。因此,我建议您将此数据从控制器放入ViewData,然后从视图中将其从ViewData中拉出。这使得控制器和视图之间的通信线路保持在一个地方并且很简单。
但是,如果你真的想从视图中访问Session,你可以。
<%: ViewContext.HttpContext.Session["key"] %>
您可以做的一件事是拥有自己的自定义视图页面类,该类派生自System.Web.Mvc.ViewPage,并将页面顶部的Inherits声明更改为指向您的视图页面。
<%@ Page ... Inherits="YourNamespace.YourViewPage" %>
您的自定义视图页面可以包含您需要的任何属性。
答案 1 :(得分:0)
为什么不想使用ViewData?是不是因为你不想在每个将一些数据放入ViewDataDictionary的动作中都有一行代码?
您可以使用操作过滤器并在每个操作执行之前放置该数据,例如
public class AddSomeDataToViewDataAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//filterContext.Controller.ViewData.Add("SomeConstant")(data);
}
}
然后,您只需将此属性放在每个Controller或基本控制器中。
修改强> 您可以制作一些扩展方法,如
public static void Add<T>(this IDictionary<string, object> dictionary, T anObject)
{
var key = typeof(T).Name;
dictionary.Add(key, anObject);
}
public static T Get<T>(this IDictionary<string, object> dictionary)
{
var key = typeof(T).Name;
return (T)dictionary[key];
}
然后添加如下数据:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//filterContext.Controller.ViewData.Add<YourListType>(data);
}
在视图中,您可以获得如下数据:
ViewData.Get<YourListType>();
问候。
答案 2 :(得分:0)
问题不明确:要回答其中的一部分,您可以在基础ViewModel上使用属性。您需要在基础ViewModel的构造函数中设置该属性。你的实例对象需要显式地调用基本ViewModel的构造函数,如果需要将任何值传递给它,无论它正在做什么工作......这个构造函数调用都是正常的C#,因此网上有很多例子。 / p>
我同意如果这是用于菜单,RenderAction似乎更容易实现功能。我尝试了菜单的基本ViewModel方法,然后在专门负责导航的控制器上切换到使用RenderAction。
缺乏ASP.NET MVC网站的动态导航示例令人惊讶,因为它似乎是一个基本要求。
答案 3 :(得分:0)
你必须更好地描述你的问题。
而且,除了动作过滤器或Controller.OnActionExecuted覆盖之外,您可以使用Html.RenderAction。