zoukankan      html  css  js  c++  java
  • 002..NET MVC实现自己的TempBag

    原文链接:http://www.dotnetbips.com/articles/bc422c95-02cc-4d05-9c5c-fa89d0e78cc0.aspx

      1.前言

          本来今天是想发那篇关于在Web API中关于路由的选择,但那一份是在公司翻译的,文件也在公司里。然后自己也比较感兴趣一些比较偏的知识。就像今天这一篇。在翻译的过程中,很多的文字自己感觉到十分的生硬,希望以后在自己看懂文章后,用文字将自己的理解表达出来,相信这样会更好。

      2. 开始

      在MVC中,相信大家都使用过ViewData或ViewBag(ViewBag是ViewData的一层封装),还一个用于在控制器向视图传递数据的方法-TempData,那我们能不能使用类似ViewBag包装ViewData的方式,使用TempBag实现动态查找值。我们可以创建一个类,如下

     1 public class TempBag: DynamicObject
     2     {
     3         TempDataDictionary tempData = null;
     4 
     5         public TempBag(TempDataDictionary tempdata)
     6         {
     7             this.tempData = tempdata;
     8         }
     9 
    10         public override bool TryGetMember(GetMemberBinder binder, out object result)
    11         {
    12             try
    13             {
    14                 //如果能找到相应的Key
    15                 if (tempData.Keys.Where(k => k == binder.Name).Count() > 0)
    16                 {
    17                     result = tempData[binder.Name];
    18                     return true;
    19                 }
    20                 else
    21                 {
    22                     result = "找不到值";
    23                     return false;
    24                 }
    25             }
    26             catch 
    27             {
    28                 result = "找不到值";
    29                 return false;
    30             }
    31         }
    32 
    33         public override bool TrySetMember(SetMemberBinder binder, object value)
    34         {
    35             try
    36             {
    37                 tempData[binder.Name] = value;
    38                 return true;
    39             }
    40             catch
    41             {
    42                 return false;
    43             }
    44         }
    45     }

          DynamicObject类位于System.Web.Mvc下,使用DynamicObject能够创建自己的动态对象。自己的类需要继承DynamicObject类,重写里面的三个方法:TrySetMember、TryGetMember、TryInvokeMember,前面两个方法用于设置和获取属性的实现,最后一个方法用于动态方法的调用,这里就不作介绍。

          3.控制器中代码

     1 public class TempDataController : Controller
     2     {
     3 
     4         dynamic tempBag = null;
     5 
     6         public TempDataController()
     7         {
     8             tempBag = new TempBag(TempData);
     9         }
    10 
    11         public ActionResult Index()
    12         {
    13             tempBag.Message = "一个很好的结果";
    14             return View();
    15         }
    16 
    17     }

          在实例化控制器的时候,将它的一个动态对象实例化为我们自己定义的类的类型。控制器的构造函数中,传递TempData作为参数,那么我们在自己类中重写的两个方法分别对应为TempData设置和获取值。

          4.在视图面的代码

     1 @{
     2     Layout = null;
     3     dynamic tempBag = new TempBag(TempData);
     4 }
     5 
     6 <!DOCTYPE html>
     7 
     8 <html>
     9 <head>
    10     <meta name="viewport" content="width=device-width" />
    11     <title>Index</title>
    12 </head>
    13 <body>
    14     <div>
    15         <p>@@tempBag.Message的值为: @tempBag.Message</p>
    16         <p>@@TempData["Message"]的值为: @TempData["Message"]</p>
    17     </div>
    18 </body>
    19 </html>

          如果没差错,那显示的结果如下图

         

          在视图页面,也需要创建一个TempBag的对象,这样才能访问到TempData对象。我们也能看到,使用@TempData["Message"]也能访问到我们定义的值,从这一侧面也表示,我们也只是为了动态访问TempData创建自己的类TempBag,就好像ViewBag之于ViewData。

     

  • 相关阅读:
    (转)vim重复命令
    (转)Linux 目录结构
    (转)Linux 文件权限
    (转)Linux查看用户及其权限管理
    linux banner命令
    redmine和svn server的部署
    OpenCV学习 7:图像形态学:腐蚀、膨胀
    OpenCV学习 6:平滑滤波器 cvSmooth()——2
    《将博客搬至CSDN》
    OpenCV学习 5:关于平滑滤波器 cvSmooth()函数
  • 原文地址:https://www.cnblogs.com/a2htray/p/3825493.html
Copyright © 2011-2022 走看看