我是设计API的新手,我在ASP.NET MVC中遇到过这种情况。
在我的域系统中,我有不同的概念,例如Invoice
。我想创建一个REST API,可以:
但是,例如,在创建新对象时,我需要一组大的参数(请参阅下面的示例viewmodel)。
如果我期待这样的路径:
POST - /api/invoice/create
我如何绕过并接受表单数据?
我最好的猜测是创建一个APIController,然后接受InvoiceViewModel
作为唯一参数。由于它是一个API控制器,我假设它默认接受JSON。
然后我有以下问题:
InvoiceViewModel
?InvoiceViewModel :
public class InvoiceViewModel
{
public int Id { get; set; }
public string Comment { get; set; }
public InvoiceAddressViewModel CompanyInfo { get; set; }
public InvoiceAddressViewModel ReceiverInfo { get; set; }
public DateTime DateCreated { get; set; }
public List<InvoiceLineViewModel> Lines { get; set; }
public decimal Total { get; set; }
public decimal VatTotal { get; set; }
public decimal VatPercentage { get; set; }
public decimal TotalExVat { get; set; }
public InvoiceViewModel()
{
this.Lines = new List<InvoiceLineViewModel>();
}
}
public class InvoiceAddressViewModel
{
public string Name { get; set; }
public string Address { get; set; }
public string Company { get; set; }
public string VatNumber { get; set; }
public string Country { get; set; }
public string ZipCode { get; set; }
public string City { get; set; }
}
public class InvoiceLineViewModel
{
public string Title { get; set; }
public int Quantity { get; set; }
public decimal Price { get; set; }
}
答案 0 :(得分:3)
Asp.net-mvc 3框架有一个默认的JsonValueProviderFactory,只要发布到Action的JSON数据与Model匹配就应该正确绑定数据。
这样的事情:
var requestData = {
Id: "1",
Comment: "The quick brown fox",
CompanyInfo: {
Name: "etc."
}
};
$.ajax({
url: '/api/invoice/create',
type: 'POST',
data: JSON.stringify(requestData),
dataType: 'json',
contentType: 'application/json; charset=utf-8',
error: function (xhr) {
alert('Error: ' + xhr.statusText);
},
success: function (result) {
alert('success');
}
});
应该正常工作,所有数据都应该正确绑定,只需将JSON属性名称与模型名称匹配。(它们必须匹配)
让模型匹配的最佳方法是在视图中将模型序列化为JSON,然后您知道它是正确的,并根据您的内容对其进行操作。
var data = set(@Html.Raw(new JavaScriptSerializer().Serialize(Model)));
至于复杂性,天空是极限你可能(非常不可能)遇到某些情况,其中.net的默认JsonValueProviderFactory不够好,但如果你这样做,我会感到惊讶。
正如旁注所示,整个用例与http://knockoutjs.com/完美配合。
玩得开心。