从ASP.NET MVC3控制器更新中返回JJ数据

时间:2011-11-11 20:04:18

标签: asp.net asp.net-mvc asp.net-mvc-3

我从我的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
        });
    }

2 个答案:

答案 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类型的属性。