我正在尝试将XML发布到动作方法。该参数始终为null。有谁知道我做错了什么?
控制器类:
namespace TestNetCore.Controllers
{
[Route("api/[controller]")]
public class BookController : Controller
{
[HttpPost]
public Book AddBook([FromBody]Book b) <-- b is always null
{
return new Book
{
Id = b.Id,
Title = b.Title
};
}
}
}
Startup.cs:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddXmlDataContractSerializerFormatters()
.AddMvcOptions(opts =>
{
opts.RespectBrowserAcceptHeader = true;
opts.ReturnHttpNotAcceptable = true;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseStaticFiles();
app.UseStatusCodePages();
app.UseDeveloperExceptionPage();
app.UseMvcWithDefaultRoute();
}
}
在project.json中我添加了这个:
"Microsoft.AspNetCore.Mvc.Formatters.Xml": "1.0.1"
模型类:
namespace TestNetCore.Models
{
[DataContract]
public class Book
{
[DataMember(Order = 1)]
public string Id { get; set; }
[DataMember(Order = 2)]
public string Title { get; set; }
}
}
发送XML的脚本:
$(document).ready(function () {
$("form").submit(function (e) {
e.preventDefault();
$.ajax({
url: "api/book",
dataType: "xml",
contentType: "application/xml; charset=utf-8",
method: "POST",
data: { b: "<Book xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/TestNetCore.Models\"><Id>1</Id><Title>Programming Book</Title></Book>" },
success: function (book) {
addBook(book);
},
error: function (jqXHR) {
alert(jqXHR.responseText);
}
})
});
});
function addBook(book) {
$("table tbody").append("<tr><td>" + book.id + "</td><td>" + book.title + "</td></tr>");
}
答案 0 :(得分:0)
您的javascript是问题所在,您发送的对象包含名为b的属性,该属性包含字符串(xml内容),并且这与使用期望和对象Book及其操作的操作合同不匹配属性:
data: { b: "<Book xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/TestNetCore.Models\"><Id>1</Id><Title>Programming Book</Title></Book>" },