2010-04-05 57 views
0

我有一个独特的场景,我希望基础控制器可以获取一些数据并将其存储在列表中。这个列表应该可以像ViewData一样从我的视图中访问。我将在每个页面上使用这个列表,并希望得到一个更清晰的解决方案,而不仅仅是将它放在ViewDataDictionary中。ASP.NET MVC从控制器传递信息,无需ViewData,ViewModel或Session

试图想出一个解决方案后,我想我会创建一个自定义ViewPage与属性来保存我的列表。我的自定义ViewPage将从System.Web.MVC.ViewPage继承。但是,我不知道MVC将视图数据从控制器传递到视图的位置。更重要的是,我如何才能将我的列表传递给视图?

感谢您的帮助。

编辑....

对不起。我试图尽可能简化问题以避免混淆。显然,这没有工作:)

我在.net mvc项目中实现我自己的会话管理。当请求进入时,我的基础控制器会检查会话cookie是否与OnActionExecuting方法中的请求一起发送。如果发送了会话cookie,我的控制器就会访问数据库并检索用户的会话信息。会话信息(用户标识等)被放入List对象并存储在名为“Sess”的属性中。

我希望能够从我的意见访问的SESS列表中的元素是这样的:

那么,如何以及在哪里让我的控制器,随手关SESS列表我的意见?

我意识到这不是通常在.net中实现自定义会话管理的方式。但是,这将是我的项目最简单,最干净的解决方案。

感谢迄今为止帮助过的所有人!

+1

这是RenderAction可能更适合这项工作的场景之一。如果有需要在每个页面上呈现的数据(如菜单),RenderAction使这更容易。这基本上只是一个简单的方法来贯穿整个生命周期,因此您可以分享您的应用程序中的零食部分(菜单,广告,小部件) – Jab 2010-04-05 15:34:49

+0

我同意Jab,如果需要一些动态数据,请使用RenderAction如果你只想渲染一个ASCX(如果你愿意的话,你也可以选择提供一个Model到RenderPartial) – mare 2010-04-05 17:44:25

回答

0

为什么你不想使用ViewData?仅仅是因为你不想在每一个将ViewDataDictionary中的数据放入一些数据的行为中都有一行代码?

您可以使用动作过滤器,并将该数据的每个动作执行之前,例如像

public class AddSomeDataToViewDataAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //filterContext.Controller.ViewData.Add("SomeConstant")(data); 
    } 
} 

然后,你只要把这个属性在每个控制器或在基本控制器。

编辑: 你可以做一些扩展方法,如

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>(); 

问候。

+0

我不想将ViewData [“Session”]作为列表时间在我的意见。 – josh 2010-04-05 19:59:42

+0

好的,我编辑了我的答案。 – uvita 2010-04-05 20:47:49

0

问题不清楚:要回答部分问题,可以在基本ViewModel上使用属性。您需要在基础ViewModel的构造函数中设置该属性。您的实例对象需要显式调用基本ViewModel的构造函数,如果任何值需要传递给它,无论它正在做什么工作......此构造函数调用都是普通的C#,因此网上有很多示例。

我同意,如果这是菜单,RenderAction似乎是一个更简单的方法来实现功能。我尝试了菜单的基本ViewModel方法,然后切换到专门负责导航的控制器上使用RenderAction。

缺乏ASP.NET MVC站点的动态导航示例是令人惊讶的,因为它看起来像这样一个基本要求。

0

你必须更好地描述你的问题。

而且,除了动作过滤器或Controller.OnActionExecuted覆盖,您可以使用Html.RenderAction

2

一般来说,我建议明确允许您的视图允许访问。因此,我建议您将这些数据放在您的控制器的ViewData中,然后从视图中将其从ViewData中提取出来。这可以将控制器和视图之间的通信线路保持在一个地方并且很简单。

但是,如果您确实想从视图访问会话,您可以。

<%: ViewContext.HttpContext.Session["key"] %> 

有一两件事你可以做的是有一个从System.Web.Mvc.ViewPage派生自己的自定义视图页面类和更改继承的声明在页面的顶部指向您的视图页面。

<%@ Page ... Inherits="YourNamespace.YourViewPage" %> 

您的自定义视图页面可能具有任何您需要的属性。