为什么.net核心在空白数据库记录中创建API调用结果

时间:2017-01-06 01:47:10

标签: asp.net-core

我使用Entity Framework创建了一个简单的.NET Core(v.1.0.0)Web应用程序。我添加了一个名为Item的简单模型,为它添加了脚手架并在Web应用程序中成功测试,即浏览到Create页面并输入信息,POST请求并按预期将新记录添加到数据库中。

Item.cs

...

public class Item {
    public int ID { get; set; }
    public string Name { get; set; }
    public int Price { get; set; }

    public Item() { }
    public Item (string name) { Name = name; }
}

...

ItemsController.cs

...

[HttpPost]
public async Task<IActionResult> Create([Bind("ID,Name,Price")] Item item)
    {
        if (ModelState.IsValid)
        {
            _context.Add(item);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }
        return View(item);
    }

...

当我从Postman或Fiddler发出我认为相同的帖子时,POST成功并且.NET Core日志表明模型有效但添加到数据库的记录不包含数据,只包含空字段。

http://localhost:28707/Items/Create

Content-Type:application / json

体:

{ 
    "Name" : "MyTest",
    "Price" : 120.0
}

日志输出:

  

Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求   启动HTTP / 1.1 POST http://localhost:28707/Items/Create 43   Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:信息:   执行操作方法CoreApiTest.Controllers.ItemsController.Create   (CoreApiTest)带参数(CoreApiTest.Models.Item) - ModelState是   有效线程0x2f84已退出,代码为0(0x0)。   Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory:信息:   执行DbCommand(7ms)[参数= [@ p0 ='?' (大小= 4000),@ p1 ='?'],   CommandType ='Text',CommandTimeout = '30'] SET NOCOUNT ON;插入   [项目]([名称],[价格])VALUES(@ p0,@ p1); SELECT [ID] FROM [Item]   WHERE @@ ROWCOUNT = 1 AND [ID] = scope_identity();   Microsoft.AspNetCore.Mvc.RedirectToActionResult:信息:正在执行   RedirectResult,重定向到/ Items。   Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:信息:   执行动作CoreApiTest.Controllers.ItemsController.Create   (CoreApiTest)在3745.0811ms

我希望我能忽略一些显而易见的东西,但不能把手指放在上面。

1 个答案:

答案 0 :(得分:2)

因为传递给控制器​​的模型是空的。

[Bind("ID,Name,Price")]用于将html表单字段绑定到模型,即当您有提交表单并使用application/x-www-form-urlencodedmultipart/form-data mime类型时。

您通过ajax将对象作为序列化的json发送。您必须使用[FromBody]来告诉ASP.NET Core从帖子正文中反序列化模型。

[HttpPost]
public async Task<IActionResult> Create([FromBody] Item item)