2011-11-11 2 views
0

자바 스크립트 클라이언트에서 반환 된 데이터가 변경된 데이터 만 포함되어 있습니다. 즉, JSON 다운로드 10 열을 포함하는 각 행을 가진 배열을 가질 수 있지만 업데이트에서 나에게 반환되는 데이터 만 업데이트 된 데이터입니다. 업데이트 할 때 변경된 열만 업데이트하려고합니다 (모든 열이 아닌).ASP.NET MVC3 컨트롤러에서 반환 된 JSON 데이터 만 가져 오기 업데이트

즉, 아래 코드와 같이 "President"클래스의 인스턴스를 전달하기 때문에 원래 JSON에 실제로 무엇이 들어 왔는지 알 길이 없습니다.

MVC3 업데이트 방법에 포함 된 내용 만 업데이트하고 일부 항목은 업데이트하지 못합니다. 즉, 열 8 개가 전달되지 않을 수 있으며 전달 된 "데이터"매개 변수에서 null이됩니다. 그 때문에 모든 데이터를 지우고 싶지 않습니다. 코드가 반사를 사용하여 모든 필드

에 대한 등등

if (data.FirstName != null) 
    rec.FirstName = data.FirstName 
. 
. 
. 

처럼 너무 지저분하고 있기 때문에

[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"의 값이 null입니다. 즉, FirstName은 변경되지 않았으므로 JSON으로 밀어 넣지 않았습니다 .Comments는 15 자 이상이어야합니다. (이 상자를 클릭하면 취소됩니다.) ... 계속 누르고 있으면이 사실에 대해 생각해보십시오. –

+0

당신은 데이터 소스에서 rec를 선택하고 있습니다. (최소한 DB는 컨텍스트라고 가정합니다.) 따라서, 'FirstName'의 현재 값을로드해야합니다. 위의 명령문은 데이터 인 경우 'FirstName'을 현재 값으로 설정합니다. 이름은 null입니다. – Maess

+0

안녕하세요, 두 가지 문제가 있습니다. 먼저, 모든 컬럼에 대해 모든 컨트롤러에 코드를 명시 적으로 작성할 필요가 없으므로이를 처리하는 좀 더 일반적인 방법이 필요합니다. 둘째, 위의 메서드는 null 입력 가능 열에 대해서만 작동합니다. 예를 들어, nullable이 아닌 boolean 열이 있는데이 메서드는 작동하지 않습니다. 나는 무엇이 다시 올지 모르겠다. 그러나 나는 boolean의 기본값이 반환 될 것이라고 추측한다. –

0

나는이 경우 반사를 사용하는 것, 그것이 쉬울 것 이것을하기 위해. 이 방법

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 종류의 호텔이 작동하지 않습니다, 염두하시기 바랍니다를 참조하십시오.

관련 문제