ASP.NET MVC项目:具有复杂输入参数的RESTful API方法

时间:2014-02-27 22:14:20

标签: c# asp.net-mvc api asp.net-mvc-4 rest

我是设计API的新手,我在ASP.NET MVC中遇到过这种情况。

在我的域系统中,我有不同的概念,例如Invoice。我想创建一个REST API,可以:

  • 创建
  • 更新
  • 删除
  • 选择(基于不同的元素)

但是,例如,在创建新对象时,我需要一组大的参数(请参阅下面的示例viewmodel)。

如果我期待这样的路径:

POST - /api/invoice/create

我如何绕过并接受表单数据?

我最好的猜测是创建一个APIController,然后接受InvoiceViewModel作为唯一参数。由于它是一个API控制器,我假设它默认接受JSON。

然后我有以下问题:

  • 在jQuery中,我如何构建一个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; }
    }

1 个答案:

答案 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/完美配合。

玩得开心。