我使用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
我希望我能忽略一些显而易见的东西,但不能把手指放在上面。
答案 0 :(得分:2)
因为传递给控制器的模型是空的。
[Bind("ID,Name,Price")]
用于将html表单字段绑定到模型,即当您有提交表单并使用application/x-www-form-urlencoded
或multipart/form-data
mime类型时。
您通过ajax将对象作为序列化的json发送。您必须使用[FromBody]
来告诉ASP.NET Core从帖子正文中反序列化模型。
[HttpPost]
public async Task<IActionResult> Create([FromBody] Item item)