• 有使用 ASP.NET MVC 的朋友應該會對於 TryUpdateModel 有一定的認知,他不但可以利用 Metadata 來做欄位的驗證確保資料的正確性,也可以指定更新的條件以及不更新的條件來達到萬用的功能,因為他的好用所以 demo 也是經常使用他,但是使用的時候多少會覺得每次都要指定欄位很麻煩嗎?這裡告訴大家一個小技巧,讓你的 TryUpdateModel 更順手。

TryUpdateModel是擁有 10個多載的方法,所以可以應用範圍是很廣的,本文將利用 ActionFilter的技巧來設定排除的欄位。

最簡單的寫法就是這樣寫

var oldData = _r.GetSingleData(id);

if (TryUpdateModel(oldData,new string[]{"欄位一,欄位二"}))
{
_r.Save();
}

第一個參數為要被更新的資料,所以必須要先查出來,第二個參數就是指定要更新的欄位,但是因為每個資料表都不一樣每次都要寫很麻煩,因此你可以改成以下寫法

public ActionResult Edit(Guid id, FormCollection collection)
{
var oldData = _r.GetSingleData(id); if (TryUpdateModel(oldData, collection.AllKeys))
{
_r.Save();
}
}

這次利用了 FormCollection 來接 View 傳過來的 Key 來做要更新的資料,省去了每次都要自己 new 字串陣列的麻煩。


但是很多時候不一定頁面傳過來的都是我們要更新的欄位所以會進一步設定排除的欄位

public ActionResult Edit(Guid id, FormCollection collection)
{
var oldData = _r.GetSingleData(id); if (TryUpdateModel(oldData,"", collection.AllKeys,new string[]{"ID","Name"}))
{
_r.Save();
}
}

如上方程式,排除了 ID 和 Name 欄位的更新


正常情況來說 每個人都有習慣開資料庫的習慣,比如說一定會有 建立時間和建立使用者,但這些東西不希望被更新雖然他已經是固定的可以寫死,但是我只能說上面的 Code 有點醜....所以我們來建立一個 ActionFilter 來玩玩。

建立一個名稱為ModelStateExcludeAttribute 的 ActionFilter,註解就寫在程式內

/// <summary>
/// 預設排除ModelState的 ID、CreateUser、CreateTime欄位驗證
/// 並且使用ViewData[Exclude]回傳
/// </summary>
public class ModelStateExcludeAttribute : ActionFilterAttribute
{
public string[] Exclude { get; set; } /// <summary>
/// 預設排除ModelState的 ID、CreateUser、CreateTime欄位驗證
/// 並且使用ViewData[Exclude]回傳
/// </summary>
public ModelStateExcludeAttribute()
{
Exclude = new string[]
{
"ID",
"CreateTime",
"CreateUser"
};
} /// <summary>
/// 可以自訂排除欄位,使用 , 分隔
/// 並且使用ViewData[Exclude]回傳
/// </summary>
public ModelStateExcludeAttribute(string exclude)
{
if (exclude != null)
{
if (exclude.Contains(","))
Exclude = exclude.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
else
Exclude = new string[] { exclude };
} }
/// <summary>
/// 進入 Action 的時候執行
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
foreach (var item in Exclude)
{
//將排除欄位一一設定
filterContext.Controller.ViewData.ModelState.Remove(item);
}
//設定完畢後將他利用 ViewData 傳到 Action 內
filterContext.Controller.ViewData["Exclude"] = Exclude;
}
}

有了這個 ActionFilter 就可以回頭改一下 Controller 的程式了,調整如下

[ModelStateExclude]
public ActionResult Edit(Guid id, FormCollection collection)
{
var oldData = _r.GetSingleData(id); if (TryUpdateModel(oldData,"", collection.AllKeys,ViewData["Exclude"] as string[]))
{
_r.Save();
}
}

看的到增加了 ModelStateExclude 這個Attribute以及原本自行宣告字串陣列的排除欄位改用 ViewData 接了


預設的情況下就是排除掉預設的欄位,如果想自訂排除欄位就可以這樣寫

[ModelStateExclude("排除一,排除二")]

以上這種寫法好處在哪呢?

一來利用了 ActionFilter來定義那就可以一目了然,並且更利於單元測試的撰寫,而且你會發現整段更新的程式沒有扯到資料庫物件,因此如果你是產生器來產 Code 的,這種寫法更適合。

ASP.NET MVC 使用TryUpdateModel 更新的技巧的更多相关文章

  1. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序更新相关数据

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第八篇:为ASP.NET MVC应用程序 ...

  2. ASP.NET MVC应用程序更新相关数据

    为ASP.NET MVC应用程序更新相关数据 这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译, ...

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

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

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

    前言有使用 ASP.NET MVC 的朋友们一定多多少少有听过 TryUpdateModel,之前就看了很多有关它的文章,但在专案实务上都未曾实际使用过,而 TryUpdateModel 不仅能利用 ...

  5. JQuery对ASP.NET MVC数据进行更新删除

    以前学习ASP.NET MVC时,学习与应用,操作过数据显示,添加,编辑,更新和删除等功能. 很多方法是相通的,看自己是怎样来进行方便,快捷,高效率. 今天Insus.NET写的练习,是直接对绑定在T ...

  6. ASP.NET MVC图片管理(更新)

    Insus.NET在ASP.NET MVC专案中,实现了图片管理,上传,预览,显示,删除等功能,还差一个功能,就是更新图片的功能,那这次来完成它.你可以先参考前2篇<ASP.NET MVC图片管 ...

  7. ASP.NET MVC EF直接更新数据(不需查询)

    EF(EntityFrameWork) ORM(对象关系映射框架/数据持久化框架),根据实体对象操作数据表中数据的一种面向对象的操作框架,底层也是调用ADO.NET ASP.NET MVC 项目会自动 ...

  8. ASP.NET MVC中几个运用技巧

    1. Razor Helpers 的运用:例如,定义好 ViewBag.Message = "Welcome to ASP.NET MVC!";我要在界面上显示"Welc ...

  9. 蒋金楠How ASP.NET MVC Works?[持续更新中…]

    一.ASP.NET + MVC IIS与ASP.NET管道 MVC.MVP以及Model2[上篇]  MVC.MVP以及Model2[下篇] ASP.NET MVC是如何运行的[1]: 建立在“伪”M ...

随机推荐

  1. 基于lua的网页脚本开发语言cgilua(转)

    这里为大家介绍基于lua脚本实现的网页开发语言,cgilua 介绍 cgilua使用Lua是一个用于创建动态网页的服务器端脚本语言.纯LUA脚本和LUA页(LP)的支持,cgilua.Lua脚本是一个 ...

  2. 【Unity技能】做一个简单的NPC

    1. 写在前面 前几天我看到cgcookie一个教程.学习了下怎么依据已有人物模型制作一个仿版的NPC人物.感觉挺好玩的,整理一下放到博客里! 先看一下教程里面的终于效果. 是不是非常像个幽灵~ 以下 ...

  3. 为什么MVC不是一种设计模式(转)

    MVC(Model-View-Controller)是处理界面应用程序时常用的解决方案,构成了表示层. MVC通过分离模型.视图.控制器在应用程序中的角色,实现界面和业务逻辑的解耦.Model(是OO ...

  4. Base64加密解密原理以及代码实现

    1. Base64使用A--Z,a--z,0--9,+,/ 这64个字符.    2. 编码原理:将3个字节转换成4个字节( (3 X 8) = 24 = (4 X 6) )先读入3个字节,每读一个字 ...

  5. ListView的操作模式的选择的更详细的解释CHOICE_MODE_MULTIPLE与CHOICE_MODE_MULTIPLE_MODAL

    本文介绍了我们将如何取得具体ListView多选择操作.本文将正确使用ListViewCHOICE_MODE_MULTIPLE要么CHOICE_MODE_MULTIPLE_MODAL时间easy误区. ...

  6. 为了解决这个问题:07文本WORD文档超链接、页码成{HYPERLINK&quot;网站&quot;}、{PAGE}/{NUMPAGES}

    版权声明:本文博主原创文章.博客,未经同意不得转载.

  7. Unity该插件NGUI得知(9)—— Tween并转换成世界坐标系的大小NGUI尺寸

    在游戏中,还有一种比较常见的动画,这是进球后产生,分数将被显示在游戏,而快速移动,使其失去位置加入.就打算使用NGUI的Tween来制作这样的分数动画效果. 依据 Unity插件之NGUI学习(2), ...

  8. j经常使用ava应用server

    什么是应用server它?它主要提供的执行环境的应用程序,为组件提供服务. 要了解更多关于,您可以查看我的博客:何为容器? Java 的应用server非常多,从功能上分为两类:WEB 应用serve ...

  9. MariaDb数据库管理系统的学习(一)安装示意图

    MariaDB数据库管理系统是MySQL的一个分支.主要由开源社区在维护,採用GPL授权许可.开发这个分支的原因之中的一个是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区採用分 ...

  10. Hybrid app 发展历程

    距离上一篇<基于微信 js-sdk 的简单应用>已经快一年了,说来真是惭愧.上次不久之后便换了工作,一直处于比较忙的状态.其次后面酣畅一段时间都没有从事移动相关的工作.直到今年3月份开始, ...