ASP.NET MVC 使用TryUpdateModel 更新的技巧
- 有使用 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 更新的技巧的更多相关文章
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序更新相关数据
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第八篇:为ASP.NET MVC应用程序 ...
- ASP.NET MVC应用程序更新相关数据
为ASP.NET MVC应用程序更新相关数据 这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译, ...
- 转:ASP.NET MVC利用TryUpdateModel来做资料更新 (二)
前言 第一篇說明了 TryUpdateModel 的簡單的應用,除了可指定更新的欄位之外也可排除更新特定的欄位,而因為可搭配 Metadata 做欄位驗證為資料又做了一層把關,但在 ASP.NET M ...
- 转:ASP.NET MVC利用TryUpdateModel来做资料更新 (一)
前言有使用 ASP.NET MVC 的朋友们一定多多少少有听过 TryUpdateModel,之前就看了很多有关它的文章,但在专案实务上都未曾实际使用过,而 TryUpdateModel 不仅能利用 ...
- JQuery对ASP.NET MVC数据进行更新删除
以前学习ASP.NET MVC时,学习与应用,操作过数据显示,添加,编辑,更新和删除等功能. 很多方法是相通的,看自己是怎样来进行方便,快捷,高效率. 今天Insus.NET写的练习,是直接对绑定在T ...
- ASP.NET MVC图片管理(更新)
Insus.NET在ASP.NET MVC专案中,实现了图片管理,上传,预览,显示,删除等功能,还差一个功能,就是更新图片的功能,那这次来完成它.你可以先参考前2篇<ASP.NET MVC图片管 ...
- ASP.NET MVC EF直接更新数据(不需查询)
EF(EntityFrameWork) ORM(对象关系映射框架/数据持久化框架),根据实体对象操作数据表中数据的一种面向对象的操作框架,底层也是调用ADO.NET ASP.NET MVC 项目会自动 ...
- ASP.NET MVC中几个运用技巧
1. Razor Helpers 的运用:例如,定义好 ViewBag.Message = "Welcome to ASP.NET MVC!";我要在界面上显示"Welc ...
- 蒋金楠How ASP.NET MVC Works?[持续更新中…]
一.ASP.NET + MVC IIS与ASP.NET管道 MVC.MVP以及Model2[上篇] MVC.MVP以及Model2[下篇] ASP.NET MVC是如何运行的[1]: 建立在“伪”M ...
随机推荐
- 代码的未来读书笔记<二>
代码的未来读书笔记<二> 3.1语言的设计 对Ruby JavaScript Java Go 从服务端client以及静态动态这2个角度进行了对照. 这四种语言因为不同的设计方针,产生了不 ...
- Cocos2d-x3.0游戏实例《不要救我》三——背景滚动周期
好.让我们来解释一下这个无限循环滚动的背景.这方面的知识一直讲到烂.我以前的文章还介绍了.所以不是那么特别清楚. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址:http://www. ...
- c# socket udp广播
一.广播消息 由于Tcp是有连接的,所以不能用来发送广播消息.发送广播消息,必须用到Udp,Udp可以不用建立连接而发送消息.广播消息的目的IP地址是一种特殊IP地址,称为广播地址.广播地址由IP地址 ...
- Windows Phone 的控件倾斜效果
原文:Windows Phone 的控件倾斜效果 Windows Phone 7的系统设置里,按钮都有一个点击倾斜的效果,但自己添加的控件就没有.但微软提供了这个效果的代码:TiltEffect MS ...
- tcpdump参数及使用介绍(转)
原文地址:http://dogdogcom.blog.51cto.com/2402458/490398 tcpdump -a 将网络地址和广播地址转变成名字: -d 将匹配信息包的代码以人们可以理解的 ...
- Android Studio如何引用jar包裹(不gradle)
这和eclipse最大的区别.与非常人的预期开始Android Studio我们很不高兴这一套. 它直接在地图上.首先通过File->Projcet structure打开project结构界面 ...
- 【iOS】UIViewController生命周期
UIViewController有2周期: 在UIViewController中,View存在两个循环:载入循环和卸载循环. 载入循环 1>程序请求controller的view. 2>假 ...
- mysql 删除重复数据sql声明
CREATE TABLE tmp AS SELECT id FROM get_review_url WHERE (no,title,name,content) IN (SELECT no,title, ...
- 【Java基础】System.arraycopy()的使用详解
由于在Java中System.arraycopy()方法在一维数组和二维数组中的表现不同,所以做了一个测试 public static void main(String[] args) { int[] ...
- ListView分页显示
出在:http://blog.csdn.net/tu_bingbing/article/details/13275107 当ListView要显示的数据过多时,为了更快的响应用户,这个 ...