惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V2EX - 技术
V2EX - 技术
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Latest news
Latest news
T
The Exploit Database - CXSecurity.com
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
L
Lohrmann on Cybersecurity
aimingoo的专栏
aimingoo的专栏
B
Blog
T
Threat Research - Cisco Blogs
罗磊的独立博客
Application and Cybersecurity Blog
Application and Cybersecurity Blog
P
Proofpoint News Feed
P
Palo Alto Networks Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
宝玉的分享
宝玉的分享
博客园 - 司徒正美
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
T
Tor Project blog
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
Martin Fowler
Martin Fowler
酷 壳 – CoolShell
酷 壳 – CoolShell
Recorded Future
Recorded Future
D
DataBreaches.Net
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家
B
Blog RSS Feed
Scott Helme
Scott Helme
P
Proofpoint News Feed
V
Vulnerabilities – Threatpost
A
Arctic Wolf
Help Net Security
Help Net Security
L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Vercel News
Vercel News
AWS News Blog
AWS News Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Schneier on Security
Hacker News: Ask HN
Hacker News: Ask HN
N
Netflix TechBlog - Medium
L
LangChain Blog
博客园 - 叶小钗
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
M
MIT News - Artificial intelligence
N
News and Events Feed by Topic
Webroot Blog
Webroot Blog
W
WeLiveSecurity

博客园 - 赶路人之刚出发

集成WebSecurity的Authorize进行身份验证时,数据库连接报错问题 Html.ActionLink传递参数 Automapper结合EF实现insert,update方法 MVC中使用RemoteAttribute异步远程验证 Html.RenderPartial WebMatrix.WebSecurity创建自定义用户属性 强类型view中List<Model〉问题 params关键字 配置LINQ中的datacontext的log路径,以记录datacontext执行了的查询sql SortedList LINQ join/left join/cross join/group by/group join/sortedlist/cast Linq to objects示例 yield return 和 Func Lamda表达式 IDisposable 匿名类型与扩展方法 对象初始化器和集合初始化器 C#自动属性 .net random伪随机数
ViewBag任意属性的实现方法
赶路人之刚出发 · 2013-05-03 · via 博客园 - 赶路人之刚出发

MVC中ViewBag可以设置任意自定义的属性,也可以读取出来。

如下面这样在controller的action方法中设置了ViewBag的一个Entires属性(该属性名字任意取)后,在相应的view中也可以读取出来,那这是怎样做到的呢?

 public ActionResult Index()
        {
           
          
            var mostrecentEntiries = (from m in dbContext.test orderby m.ID descending select m).Take(10);
            ViewBag.Entires = mostrecentEntiries;         
            return View();
        }

先来看ViewBag是个什么东西?ViewBag在ControllerBase类中的定义如下:

   [Dynamic]
    public object ViewBag
    {
        [return: Dynamic]
        get
        {
            Func<ViewDataDictionary> viewDataThunk = null;
            if (this._dynamicViewDataDictionary == null)
            {
                if (viewDataThunk == null)
                {
                    viewDataThunk = delegate {
                        return this.ViewData;
                    };
                }
                this._dynamicViewDataDictionary = new DynamicViewDataDictionary(viewDataThunk);
            }
            return this._dynamicViewDataDictionary;
        }
    }

看出来了,他其实是一个DynamicViewDataDictionary类型,而DynamicViewDataDictionary得类型定义又如下:

internal sealed class DynamicViewDataDictionary : DynamicObject
{
    // Fields
    private readonly Func<ViewDataDictionary> _viewDataThunk;

    // Methods
    public DynamicViewDataDictionary(Func<ViewDataDictionary> viewDataThunk)
    {
        this._viewDataThunk = viewDataThunk;
    }

    public override IEnumerable<string> GetDynamicMemberNames()
    {
        return this.ViewData.Keys;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = this.ViewData[binder.Name];
        return true;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        this.ViewData[binder.Name] = value;
        return true;
    }

    // Properties
    private ViewDataDictionary ViewData
    {
        get
        {
            return this._viewDataThunk();
        }
    }

 

关键就是实现了上述两个绿色的方法,我们自己也来模拟一个这样的效果看,只需自定义一个继承了DynamicObject的类并重写TrySetMember,TryGetMember两个方法即可实现ViewBag同样的效果:

 class myDynamic : DynamicObject
        {
            Dictionary<string, object> ViewData;
            public override bool TrySetMember(SetMemberBinder binder, object value)
            {
                this.ViewData[binder.Name] = value;
                return true;
            }
            public override object TryGetMember(GetMemberBinder binder, object value)
            {

                return this.ViewData[binder.Name];
            }
        }
        protected void Application_Start()
        {
            dynamic myDynamic = new myDynamic();
            myDynamic.Data = "aaa";
            string stra = myDynamic.Data;