• 有使用 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. Codeforces 385B Bear and Strings

    题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. ...

  2. CSS设计指南之浮动与清除

    原文:CSS设计指南之浮动与清除 浮动意思就是把元素从常规文档流中拿出来,浮动元素脱离了常规文档流之后,原来紧跟在其后的元素就会在空间允许的情况下,向上提升到与浮动元素平起平坐. 一.浮动 CSS设计 ...

  3. C++习题 对象数组求最大值

    Description 建立一个对象数组,内放n(<10)个学生的数据(学号.成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出n个学生中成绩最高者,并输出其学号. In ...

  4. Paint获取Text的宽和高的数据

    获取字符串的宽度: public static float GetTextWidth(String text, float Size) { // 第一个参数是要计算的字符串,第二个参数是字提大小 Te ...

  5. Android下拉刷新上拉载入控件,对全部View通用!

    转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/38868463 前面写过一篇关于下拉刷新控件的博客下拉刷新控件终结者:Pull ...

  6. 【Android基础】listview控件的使用(3)------Map与SimpleAdapter组成的多显示条目的Listview

    前面介绍的两种listview的使用都是最基础的,所以有很大的局限性,比如只能在一个item(即每一行的条目)中显示一个文本信息,这一篇我将介绍Map与SimpleAdapter组成的多显示条目的Li ...

  7. Sublime Text 3 搭建Go开发环境(Windows)

    一.安装GO 如果已经环境已经配置好,这一步省略.... 1.下载并安装go sdk 2.配置环境变量 (1). 新建 变量名:GOBIN 变量值 :F:\Go\bin (2). 新建 变量名:GOA ...

  8. C奇淫技巧,——宏神奇

    一个.宏列表 当这个问题面临: 有一个标志变量.位代表对应的含义. 我们须要提供一组函数来訪问设置这些位.可是对于每一个标记位的操作函数都是相似的.若有32个位,难道要搞32套相似的操作函数么? 你或 ...

  9. 改写String类别

    主要4默认功能重写: 代码: #include <iostream> using namespace std; class Cstring{ private : char * data; ...

  10. SQL Server高可用——日志传送(4-1)——概论

    原文:SQL Server高可用--日志传送(4-1)--概论 本文作为学习总结,部分内容出自联机丛书及其他书籍 日志传送是什么? SQLServer 2012之前(2012出现了AlwaysOn), ...