2017-02-18 2 views
3

От клиентского кода JavaScript Я создаю следующие данные:ASP.NET Web Api - «PATCH» с помощью Delta <...> с двойным свойство не работает

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

Я тогда передать это через вызов Ajax к Web MVC Действие 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(); 
     } 
    } 

Примечание: Я пропустил некоторые детали для краткости, так как фактический клиент-сервер работает нормально.

Код, похоже, работает должным образом, но свойство Salary (единственное нестрочное) всегда равно 0 (ноль). Так что поле никогда не будет обновляться.

Любые идеи, почему Заработная плата не проходит?

Примечание: Я использую очень похожий код клиент-сервер для GET/POST/PUT/DELETE, и все они работают хорошо, поэтому я считаю, что это связано с> части Delta <.

ответ

1

Да, я столкнулся с той же проблемой с объектами int.

Я решил проблему, используя SimplePatch (v1.0 только 10KB).

Отказ от ответственности: Я автор проекта.

Он вдохновлен Microsoft.AspNet.WebApi.OData, но SimplePatch не имеет зависимостей.

Как использовать Установите пакет с помощью:

Install-Package SimplePatch 

Ваш MVC Web 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, SimplePatch дает вам возможность игнорировать некоторые свойства при вызове метода Patch.

Global.asax или Startup.cs

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

Если Salary имеет тип int, то есть проблема с этим типом

Анализатор Json преобразует целые 64 битные, которые не будет соответствовать 32-битным int свойствам, объявленным на объекте, и таким образом проигнорировать этот метод.

Эта проблема упоминается here

Таким образом, вы можете использовать long вместо int или используя форматтер типа носителя OData См this

+0

Как мы можем сказать парсеру JSON, чтобы использовать int32? – Marty

+0

Вы можете использовать ODataMediaTypeFormatter или сторонние библиотеки – Marusyk

Смежные вопросы