前言
有使用 ASP.NET MVC 的朋友们一定多多少少有听过 TryUpdateModel,之前就看了很多有关它的文章,但在专案实务上都未曾实际使用过,而 TryUpdateModel 不仅能利用 Metadata 来做栏位验证确保资料正确性,也可以指定更新的条件或是指定某几个栏位不更新,这几天刚好有时间就写了简单的范例,来看看它到底有什么神奇魔力吧。

说明
首先我们先定义一个 Model 如下:


 

一般透过 TryUpdateModel 来做资料更新,最简单的写法如下 :

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(int Id)
{
Product product = db.Product.Where(p => p.Id.Equals(Id)).FirstOrDefault();
if (TryUpdateModel(product, new string[] { "Name", "Ename", "ModifyUid" }))
{
db.SaveChanges();
return RedirectToAction("Index");
}
return View(product);
}

在 TryUpdateModel 里的第一个参数为要被更新的资料,而第二个参数则是我们要细节的资料,这时候可能会有个疑问,那它细节的资料是从哪边而来的?「其实就跟 Model Binding 的机制很像,TryUpdateModel 会透过你从表单回传的资料,只要名称一样就会自己系节上去啰。」

所以透过上面的程式码,只会更新 Name、Ename、ModifyUid 这三个栏位,其他栏位的资料是不会做更新的。www.it165.net

但如果今天我们页面上的栏位有十几二十个的的话,若使用上面的方法光打栏位名称可能就会花费许多时间!
此时我们可以利用 FormCollection 来接收 View 传来的资料来做栏位更新,所以可以改成以下写法:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(int Id, FormCollection FromValue)
{
Product product = db.Product.Where(p => p.Id.Equals(Id)).FirstOrDefault();
if (TryUpdateModel(product, FromValue.AllKeys) && ModelState.IsValid)
{
db.SaveChanges();
return RedirectToAction("Index");
}
return View(product);
}

但问题又来了,一般情况下总是会有某些栏位是不希望使用者去做更新的,则透过 TryUpdateModel 的多载来达到排除栏位的效果,如下:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(int Id, FormCollection FromValue)
{
Product product = db.Product.Where(p => p.Id.Equals(Id)).FirstOrDefault();
if (TryUpdateModel(product, "", FromValue.AllKeys, new string[] { "ModifyUid" }))
{
db.SaveChanges();
return RedirectToAction("Index");
}
return View(product);
}

如上面的程式片段,我们可以排除更新 ModifyUid 的栏位。

总结
TryUpdateModel 拥有了10个多载的方法,所以它可以应用的范围也非常广,但在使用上也有需要注意的地方,像是其第一个多载方法就存在着「安全性问题」,因为预设是接收 View 所传来的资料来做资料系结,只要是符合的栏位就会直接写入 Model 中,所以当你有某些栏位是不想给使用者更新时,请务必设定「白名单」或「黑名单」!

转:ASP.NET MVC利用TryUpdateModel来做资料更新 (一)的更多相关文章

  1. 转:ASP.NET MVC利用TryUpdateModel来做资料更新 (二)

    前言 第一篇說明了 TryUpdateModel 的簡單的應用,除了可指定更新的欄位之外也可排除更新特定的欄位,而因為可搭配 Metadata 做欄位驗證為資料又做了一層把關,但在 ASP.NET M ...

  2. ASP.NET MVC 利用ActionFilterAttribute来做权限等

    ActionFilterAttribute是Action过滤类,该属于会在执行一个action之前先执行.而ActionFilterAttribute是 MVC的一个专门处理action过滤的类.基于 ...

  3. ASP.NET MVC利用PagedList分页(二)PagedList+Ajax+JsRender

    (原文) 昨天在ASP.NET MVC利用PagedList分页(一)的 最后一节提到,一个好的用户体验绝对不可能是点击下一页后刷新页面,所以今天来说说利用Ajax+PagedList实现无刷新(个人 ...

  4. 转:【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链

    [译]Asp.net MVC 利用自定义RouteHandler来防止图片盗链   你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你 ...

  5. [ASP.NET MVC] 利用动态注入HTML的方式来设计复杂页面

    原文:[ASP.NET MVC] 利用动态注入HTML的方式来设计复杂页面 随着最终用户对用户体验需求的不断提高,实际上我们很多情况下已经在按照桌面应用的标准来设计Web应用,甚至很多Web页面本身就 ...

  6. 返璞归真 asp.net mvc (1) - 添加、查询、更新和删除的 Demo

    原文:返璞归真 asp.net mvc (1) - 添加.查询.更新和删除的 Demo [索引页] [源码下载] 返璞归真 asp.net mvc (1) - 添加.查询.更新和删除的 Demo 作者 ...

  7. ASP.NET MVC 使用TryUpdateModel 更新的技巧

    有使用 ASP.NET MVC 的朋友應該會對於 TryUpdateModel 有一定的認知,他不但可以利用 Metadata 來做欄位的驗證確保資料的正確性,也可以指定更新的條件以及不更新的條件來達 ...

  8. ASP.NET MVC 利用IRouteHandler, IHttpHandler实现图片防盗链

    你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽.下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义Ro ...

  9. [ASP.NET MVC] 利用自定义的AuthenticationFilter实现Basic认证

    很多情况下目标Action方法都要求在一个安全上下文中被执行,这里所谓的安全上下文主要指的是当前请求者是一个经过授权的用户.授权的本质就是让用户在他许可的权限范围内做他能够做的事情,授权的前提是请求者 ...

随机推荐

  1. BZOJ1769 : [Ceoi2009]tri

    将所有点极角排序,建立线段树,线段树每个节点维护该区间内所有点组成的上下凸壳. 对于一个查询,二分查找出相应区间的左右端点,在线段树上得到$O(\log n)$个节点,在相应凸壳上三分查找出与斜边叉积 ...

  2. Designing CSS Layouts With Flexbox Is As Easy As Pie

    This article is an updated excerpt of the chapter “Restyle, Recode, Reimagine With CSS3″ from our Sm ...

  3. Channel 笔记本项目 (门户客户端 和 wp7客户端(介绍1))

    Channel 笔记本项目:(所包含 门户客户端 和 wp7客户端)              首先wp7客户端中,首页向右滑行,到了新闻(博文):(点触某篇新闻后,进入到新闻详细页面,在菜单栏所对应 ...

  4. git 用Gitk /usr/bin/which: no wish

    /usr/bin/which: no wish 安装yum -y install tcl 和yum -y install tk 显示所有的分支 $gitk --all 显示所有的分支 $gitk -- ...

  5. [LintCode] Implement Trie 实现字典树

    Implement a trie with insert, search, and startsWith methods. Have you met this question in a real i ...

  6. [转]Entity Framework走马观花之把握全局

    本文转自:http://blog.csdn.net/bitfan/article/details/12887007 Entity Framework走马观花 之 把握全局 ============== ...

  7. 注意自己的dns设置 - 阿权的书房

    一般而言,随便找个合适的dns服务器作为自己的dns解析服务器即可,但如果选择不当,可能就会导致网络选择并不是最优的.这个情况一般发生在电信网通优化的域名上. 检查方法(域名有所替换): [root@ ...

  8. NBUT 1186 Get the Width(DFS求树的宽度,水题)

    [1186] Get the Width 时间限制: 1000 ms 内存限制: 65535 K 问题描述 It's an easy problem. I will give you a binary ...

  9. HDU 1430 魔板(康托展开+BFS+预处理)

    魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  10. Redis 笔记与总结4 set 和 zset 类型

    (一)set 类型 set 是集合是 string 类型的无序集合. set 元素最大可以包含(2 的 32 次方)个元素.set 的是通过 hash table 实现的,所以添加.删除和查找的复杂度 ...