我从我的JavaScript客户端返回的数据中只包含已更改的数据。也就是说,我可能有一个数组,每行包含10列JSON下载,但在Update上,只有返回给我的数据才是更新的数据。在我的更新中,我只想更新那些已更改的列(不是全部)。
换句话说,我有类似下面的代码,但因为我传递的是“总统”类的一个实例,我无法知道原始JSON的实际内容。
如何更新MVC3更新方法中的内容而不是所有列。也就是说,其中8列可能不会进入,并且在传入的“data”参数中将为null。我不想因此消灭所有数据。
[HttpPost]
public JsonResult Update(President data)
{
bool success = false;
string message = "no record found";
if (data != null && data.Id > 0)
{
using (var db = new USPresidentsDb())
{
var rec = db.Presidents.FirstOrDefault(a => a.Id == data.Id);
rec.FirstName = data.FirstName;
db.SaveChanges();
success = true;
message = "Update method called successfully";
}
}
return Json(new
{
data,
success,
message
});
}
答案 0 :(得分:0)
rec.FirstName = data.FirstName ?? rec.FirstName;
答案 1 :(得分:0)
在这种情况下我会使用反射,因为代码会像
那样过于混乱if (data.FirstName != null)
rec.FirstName = data.FirstName
.
.
.
所有字段的等等
使用反射,这样做会更容易。见这个方法
public static void CopyOnlyModifiedData<T>(T source, ref T destination)
{
foreach (var propertyInfo in source.GetType().GetProperties())
{
object value = propertyInfo.GetValue(source, null);
if (value!= null && !value.GetType().IsValueType)
{
destination.GetType().GetProperty(propertyInfo.Name, value.GetType()).SetValue(destination, value, null);
}
}
}
<强> USAGE 强>
CopyOnlyModifiedData<President>(data, ref rec);
请注意,这不适用于value
类型的属性。