2014-11-24 2 views
0

약 50 개의 필드가 포함 된 고객 세부 정보에 대해 큰 형식이 있습니다. 고객은 주소 및 연락처와 같은 자신의 정보를 업데이트 할 수 있습니다. 프로필을 편집 할 때 편집 가능한 50 개의 입력 필드가 모두 표시됩니다. 그가 주소 필드만을 편집 할 때 POST에서 수정 된 필드를 결정하여 해당 필드 만 기본 시스템 (SAP)으로 보내도록하려고합니다.asp.net mvc에서 수정 된 필드를 확인하는 방법?

이것은 내가 지금까지 한 일이다,

  1. 업데이트 시스템의 모든 50 개 필드, 내가 필드가 수정 된 판별 할 수없는이기 때문에.
  2. 수정 된 필드 만 확인하려면 viewModel에서 50 개의 필드를 추가로 유지 관리하고 관련 필드를 비교하여 수정되는 필드를 결정하십시오.

그러나이 두 방법 모두 디자인 실천이 좋지 않으며 성능에 추가 오버 헤드가 추가됩니다.

알고 싶습니다. 수정 된 필드에 대해서만 업데이트 요청을 보내도록 POST에서 수정 된 필드를 어떻게 확인할 수 있습니까?

감사합니다.

+0

를 얻을 것이다 (이 인라인 편집) 자바 스크립트를 통해 클라이언트에서 수정 된 필드를 추적하고 목록에 포함에 귀하의 POST 요청. 그것은 꽤 광범위한 주제입니다. –

+0

감사합니다 @AntP, 올바른 방향으로 나를 가리 키시겠습니까? 클라이언트의 수정 된 필드를 추적하여 컨트롤러의 정보를 얻고 싶습니다. –

+0

모델 구조가 어쨌든 _simple_ 인 경우이 게시물에서 설명한 것과 비슷하게 할 수 있습니다. [모든 속성의 속성을 반복적으로 반복하여 두 객체 비교] (http://stackoverflow.com/a/25064247/1207195). –

답변

1

웹 API 2 및 EF6을 사용하여 API를 작성하는 중에 비슷한 문제점이 최근에 발생했습니다.

많은 필드가있는 엔티티가 있는데 json에서 수신되는 필드 만 업데이트하려고합니다. 나는에서 JSON을 읽어 함수 호출

public IHttpActionResult Update(int id){ ... } 

에서 제품을 제거

public IHttpActionResult Update(int id, Product product) { ... } 

:

그래서 대신 ASP 디시리얼라이저를 사용하여 수신의 목적은 그래서 같은

를 구문 분석 요청 기관

var rawBody = Request.Content.ReadAsStringAsync().Result; 

디시리얼라이저

Dictionary<string, string> rawProduct = JsonConvert 
       .DeserializeObject<Dictionary<string, string>>(rawBody); 

업데이트 필드 사전

rawProduct.Remove("Id"); 

제품을 연결에서 아이디 키를 제거 업데이트 객체를

var product = JsonConvert.DeserializeObject<Product>(rawBody); 

빌드 필드와 값을 사전에 JSON 내용 문맥에

dbContext.Products.Attach(product); 

개체의 모든 속성을 반복하면 해당 개체가 사전에 있는지 확인하고 수정 된 특성을 true로 설정합니다.

foreach(var p in product.GetType().GetProperties()){ 
    if(rawProduct.ContainsKey(p.Name)) { 
     dbContext.Entry(product).Property(p.Name).IsModified = true; 
    } 
} 

전체 코드 : @klimslava에서 솔루션

public IHttpActionResult Update(int id){ 

    var rawBody = Request.Content.ReadAsStringAsync().Result; 

    Dictionary<string, string> rawProduct = JsonConvert 
        .DeserializeObject<Dictionary<string, string>>(rawBody); 

    var product = JsonConvert.DeserializeObject<Product>(rawBody); 

    rawProduct.Remove("Id"); 

    dbContext.Products.Attach(product); 

    foreach(var p in product.GetType().GetProperties()){ 
     if(rawProduct.ContainsKey(p.Name)) { 
      dbContext.Entry(product).Property(p.Name).IsModified = true; 
     } 
    } 

    dbContext.SaveChanges(); 
} 
0

와 유사합니다. 차이점은 propertyIsModified을 true로 설정하는 대신. 현재 Product을 읽고 그 값을 설정합니다. 그렇지 않으면, 당신은 각 필드에 대한 개별 요청을 가진 이르기까지이 작업을 수행하는 방법, 많은있다 DbEntityValidationException

public IHttpActionResult Update(int id){ 
    var rawBody = Request.Content.ReadAsStringAsync().Result; 

    Dictionary<string, string> rawProduct = JsonConvert 
       .DeserializeObject<Dictionary<string, string>>(rawBody); 

    var product = JsonConvert.DeserializeObject<Product>(rawBody); 

    rawProduct.Remove("Id"); 

    var currentProduct = dbContext.Products.Find(product.Id); 

    foreach(var p in product.GetType().GetProperties()){ 
     if(rawProduct.ContainsKey(p.Name)) { 
      p.SetValue(currentDocument, p.GetValue(document)); 
     } 
    } 

    dbContext.SaveChanges(); 
} 
관련 문제