ASP.NET MVC将信息从控制器传递到没有ViewData,ViewModel或Session的视图

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

要回复问题请先登录注册