• 有使用 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. Encountered a section with no Package: header

    刚才打开ubuntu,我的版本号是11.04.正想打开新立得软件工具包更新软件的时候,出现了例如以下错误: E:Encountered a section with no Package: heade ...

  2. 国内外MD5在线解密网站

    -http://www.cmd5.com/english.aspx (457,354,352,282) - http://www.md5crack.com - http://www.hashcheck ...

  3. C日常语言实践中小(四)——勇者斗恶龙

    勇者斗恶龙 愿你的国有n龙的头,你想聘请骑士杀死它(全部的头). 村里有m个骑士能够雇佣,一个能力值为x的骑士能够砍掉恶龙一个致敬不超过x的头,且须要支付x个金币. 怎样雇佣骑士才干砍掉恶龙的全部头, ...

  4. HDU 4391 Paint The Wall 段树(水

    意甲冠军: 特定n多头排列.m操作 以下是各点的颜色 以下m一种操纵: 1 l r col 染色 2 l r col 问间隔col色点 == 通的操作+区间内最大最小颜色数的优化,感觉非常不科学... ...

  5. ASP.NET vNext or .NET vNext?

    ASP.NET vNext or .NET vNext? 从概念和基础开始 vNext在曝光以来绝大多数以ASP.NET vNext这样的的字眼出现,为什么这边会提及.NET vNext?原因是我认为 ...

  6. 示例:Netty 处理 TCP数据分包协议

    一个.Netty解决TCP协议的数据分包的想法 我们知道通过TCP协议发送接收数据时,假设数据过大.接收到的数据会是分包的.比方:                                   ...

  7. Windows Phone 8 ControlTiltEffect

    /* Copyright (c) 2010 Microsoft Corporation. All rights reserved. Use of this sample source code is ...

  8. html分析器——jericho-html-3.3分解table

    原部分来自Internet上的其他博客,只是因为很长一段时间.忘了谁是参考,这里说声抱歉.. 先贴一些html页: <html> <head> <meta http-eq ...

  9. 网络请求 http get post 一

    Http 定义了与server交互的不同方法.最主要的方法有4种.各自是Get POST PUT DELETE ,URL 全称资源描写叙述符,我们能够这样觉得一个URL地址,一个URL地址,它用于描写 ...

  10. 熟人Dubbo 系列1-Dubbo什么

    Dubbo阿里巴巴内部SOA治理方案和服务的核心框架.每天2000+ 个服务提供3,000,000,000+ 次訪问量支持,并被广泛应用于阿里巴巴集团的各成员网站.Dubbo自2011年开源后,已被很 ...