2017-02-18 11 views
3

작동하지 델타 <...>를 사용하여 "PATCH"ASP.NET의 웹 API - 더블 속성이 나는 다음과 같은 데이터를 생성하고 자바 스크립트 클라이언트 코드에서

var employee = { 
     FirstName: "Rudolf", 
     Salary: 99 
    }; 

내가 다음 MVC 웹에 Ajax 호출을 통해이 통과를 API 컨트롤러 액션이 다음과 같이 데이터베이스를 업데이트하는 내 서비스를 호출

using System.Web.Http.OData; 

    public async Task<IHttpActionResult> Patch([FromUri] int employeeId, [FromBody] Delta<Employee> employee) 
    { 
     await _employeeService.Patch(employeeId, employee); 
     return Ok(); 
    } 

:

public async Task Patch(int employeeId, Delta<Employee> employee) 
    { 
     using (var context = new DBEntities()) 
     { 
      if (employee.TryGetPropertyValue("Salary", out object salary)) 
      { 
       var ss = Convert.ToDouble(salary); // Always 0 
      } 

      if (employee.TryGetPropertyValue("FirstName", out object firstName)) 
      { 
       var ss = Convert.ToString(firstName); // Expected value 
      } 

      var currentEmployee = await context.Employees 
       .FirstOrDefaultAsync(e => e.Id == employeeId); 

      if (currentEmployee == null) 
       return; 

      employee.Patch(currentEmployee); 

      await context.SaveChangesAsync(); 
     } 
    } 
,536,

참고 : 실제 클라이언트 - 서버 호출이 정상적으로 작동하기 때문에 간결하게하기 위해 일부 정보가 누락되었습니다.

코드가 예상대로 작동하지만 Salary 속성 (유일한 문자열이 아닌 문자열)이 항상 0으로 설정되어 있습니다. 그래서 그 분야는 절대로 업데이트되지 않습니다.

급여가 전달되지 않는 이유는 무엇입니까?

: 나는/GET/POST/PUT 매우 유사한 클라이언트 - 서버 코드를 사용하여 삭제하고 그들은 모두 잘 작동, 그래서 그것이 델타 <> 부분 관련이있다 생각합니다.

답변

1

예, int 속성에서 동일한 문제가 발생했습니다.

SimplePatch (v1.0은 10KB 만 사용)으로 문제를 해결했습니다.

면책 조항 : 저는이 프로젝트의 저자입니다.

Microsoft.AspNet.WebApi.OData에 영감을 얻었지만 SimplePatch은 (는) 의존성이 없습니다.

Install-Package SimplePatch 

귀하의 MVC 웹 API 컨트롤러 액션이된다 :

using SimplePatch; 

public async Task<IHttpActionResult> Patch([FromUri] int employeeId, [FromBody] Delta<Employee> employee) 
{ 
    await _employeeService.Patch(employeeId, employee); 
    return Ok(); 
} 

를 그런 다음 Patch 방법이 될 : 사용하여 설치 패키지를 를 사용하는 방법

public async Task Patch(int employeeId, Delta<Employee> employee) 
{ 
    using (var context = new DBEntities()) 
    { 
     if (employee.TryGetPropertyValue("Salary", out object salary)) 
     { 
      var ss = Convert.ToDouble(salary); 
     } 

     if (employee.TryGetPropertyValue("FirstName", out object firstName)) 
     { 
      var ss = Convert.ToString(firstName); 
     } 

     var currentEmployee = await context.Employees 
      .FirstOrDefaultAsync(e => e.Id == employeeId); 

     if (currentEmployee == null) 
      return; 

     employee.Patch(currentEmployee); 

     await context.SaveChangesAsync(); 
    } 
} 

에이 lso, SimplePatchPatch 메서드를 호출 할 때 일부 속성을 무시할 수있는 기능을 제공합니다.

을 Global.asax 또는 Startup.cs

DeltaConfig.Init((cfg) => 
{ 
    cfg.ExcludeProperties<Employee>(x => x.YourPropertyName); 
}); 
1

Salaryint 다음

json으로 파서는 64 명 비트들로 정수 변환 유형에 문제가 입력되어있는 경우 어느 엔티티에서 선언 된 32 비트 int 속성과 일치하지 않으므로이 메서드에서 무시됩니다.

이 문제는 here

그래서, 당신은 대신 intlong를 사용하거나 this

+0

우리가 어떻게 INT32를 사용하여 JSON 파서를 알 수 있습니다 참조 중 하나로, OData 미디어 타입 포맷터를 사용하여 수를 언급? – Marty

+0

ODataMediaTypeFormatter 또는 타사 라이브러리를 사용할 수 있습니다. – Marusyk