ASP.NET Web Api - " PATCH"使用Delta< ...>双重财产不起作用

时间:2017-02-18 04:05:20

标签: asp.net asp.net-mvc asp.net-web-api delta

从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;相关。一部分。

2 个答案:

答案 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);
});