如何创建一个将在asp.net mvc中返回当前PageData的包装器?

时间:2011-08-06 16:10:24

标签: c# asp.net-mvc

我想创建一个包装类,让我使用PageData,因为它是一个强类型的类 我之前在asp.net中使用此方法使用HttpContext.Current.Session来定义我可以存储在会话中的所有项目,并且会话的所有操作都是通过该类完成的。
示例

namespace app.Web
{
    public static class Session
    {
        public string UserName
        {
        get { return HttpContext.Current.Session["UserName"] as string; }
        set { HttpContext.Current.Session["UserName"] = value; }
        }
        ...........
    }
}

我想知道如何以类似的方式获取Pagedata。

1 个答案:

答案 0 :(得分:2)

PageData仅在页面本身可用,在其他任何地方都不可用(如控制器)。执行此操作的最佳方法是使用扩展方法。

Frederik Vig写了一篇blog post来展示如何做到这一点。

示例:

namespace PageData.Extensions
{
    public static partial class PageDataExtensions
    {
        public static string UserName(this PageData page)
        {
            return page["UserName"] as string;
        }
    }
}
顺便说一下,您也可以使用相同的Session方法,这可能比您提出的方法更清晰。

编辑:

根据您的评论,还有其他几种选择。

  1. 将您的数据创建为类,并将该类添加为扩展名。就像上面一样,但是以PageData.Utils.UserName这种方式将它添加到PageData intellisense中并且不会使它太杂乱,并且允许你从扩展方法中过滤掉PageData方法。
  2. 按照您的意愿创建静态类,但使用方法而不是属性。
  3. 示例:

    public static class Utils
    {
        public static string UserName(IDictionary<object,dynamic> pageData) {
            return pageData["UserName"] as string;
        }
    }
    

    然后在您的代码中执行此操作(假设您在视图中有正确的@using语句):

    @Utils.UserName(PageData)