首页 > 代码库 > 002..NET MVC实现自己的TempBag
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 = http://www.mamicode.com/null; 4 5 public TempBag(TempDataDictionary tempdata) 6 { 7 this.tempData =http://www.mamicode.com/ tempdata; 8 } 9 10 public override bool TryGetMember(GetMemberBinder binder, out object result)11 {12 try13 {14 //如果能找到相应的Key15 if (tempData.Keys.Where(k => k == binder.Name).Count() > 0)16 {17 result = tempData[binder.Name];18 return true;19 }20 else21 {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 try36 {37 tempData[binder.Name] = value;38 return true;39 }40 catch41 {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。