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

本文关键字:返回 一个 PageData 包装 net asp mvc 创建 | 更新日期: 2023-09-27 18:04:46

我想创建一个包装器类,让我使用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

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

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

Frederik Vig写了一篇博客文章,展示了如何做到这一点。

的例子:

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智能感知,不会使它太混乱,并允许你过滤掉PageData方法从扩展方法。
  2. 创建你的静态类,就像你想要的,但使用方法而不是属性。

的例子:

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

然后在你的代码中这样做(假设你在你的视图中有正确的@using语句):

@Utils.UserName(PageData)
相关文章: