从JavaScript客户端代码我创建以下数据:
var employee = {
FirstName: "Rudolf",
Salary: 99
};
然后我通过Ajax调用传递给MVC Web API Controller Action:
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&lt;&gt;相关。一部分。
答案 0 :(得分:2)
如果Salary
的类型为int
,那么该类型存在问题
Json解析器将整数转换为64位,这不会与实体上声明的32位int
属性匹配,因此被此方法忽略。
提到了here
这个问题因此,您可以使用long
代替int
或使用OData媒体类型格式化程序
见this
答案 1 :(得分: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();
}
}
此外,SimplePatch使您能够在调用Patch
方法时忽略某些属性。
Global.asax 或 Startup.cs
DeltaConfig.Init((cfg) =>
{
cfg.ExcludeProperties<Employee>(x => x.YourPropertyName);
});