2011-11-11 18 views
0

我從JavaScript客戶端返回的數據只包含已更改的數據。也就是說,我可能有一個數組,每行包含10個JSON下載列,但在Update上,只有返回給我的數據是更新的數據。在我的更新中,我只想更新那些已更改的列(不是全部)。從ASP.NET MVC3控制器中選出剛返回的JSON數據更新

換句話說,我的代碼如下所示,但是因爲我傳入了「總統」類的實例,所以我無法知道原始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
rec.FirstName = data.FirstName ?? rec.FirstName; 
+0

嗨Maess,這正是我不想做的。它會在FirstName中刪除我的真實數據。 FirstName未在JSON中返回,「data.FirstName」中的值將爲空。也就是說,FirstName並沒有改變,所以它沒有被推送爲JSON.Comments的長度至少爲15個字符(點擊這個框來解散)......堅持,讓我想想這個。 –

+0

你正在從數據源中選擇rec(至少我假設db是你的上下文),因此,它應該加載'FirstName'的當前值,上面的語句會將'FirstName'設置爲其當前值(如果是數據)。 FirstName爲空。 – Maess

+0

嗨Maess,兩個問題。首先,我希望有一個更通用的方法來處理這個問題,所以我不必在每個控制器的每一列都寫明代碼。其次,上述方法僅適用於可爲空的列。例如,我有非空的布爾列,這種方法不適用於。我不知道會返回什麼,但我猜布爾值的默認值將被返回。 –

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); 
     } 
    } 
} 

用法

CopyOnlyModifiedData<President>(data, ref rec); 

請介意,這不會對value類型屬性的作用。

相關問題