【问题标题】:MVC ApiController JSON objectrootMVC ApiController JSON 对象根
【发布时间】:2015-02-15 05:16:23
【问题描述】:

我正在使用 Microsoft MVC 4 ApiController 为 Ember 应用程序呈现 JSON。 ApiController 返回 JSON,如下所示:

[{"id": 1, "customerName": "Customer 1"}]

Ember 期望 JSON 被这样的 objectroot 格式化:

{"customers": [{"id": 1, "customerName": "Customer 1"}]

发布新的客户记录也是如此。 Ember 发布带有 objectroot 的 JSON,而 MVC 期望 JSON 没有 objectroot:

{"customers": [{"customerName": "Customer 1"}]

我已更改 WebApiConfig 以将 JSON 属性更改为驼峰式(因此键看起来像“customerName”而不是“CustomerName”)。我相信可以添加一个 JsonConverter 来添加/删除 JSON objectroot,但我不知道该怎么做。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
        jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

控制器如下所示:

public class CustomersController : ApiController
{
    private DatabaseContext db = new DatabaseContext();

    public IEnumerable<Customer> GetCustomers()
    {
        return db.Customers.AsEnumerable();
    }

    public HttpResponseMessage PostCustomer([FromBody] Customer customer)
    {
        if (ModelState.IsValid)
        {
            db.Customers.Add(customer);
            db.SaveChanges();

            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, customer);
            response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = customer.Id }));
            return response;
        }
        else
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        }
    }
}

【问题讨论】:

  • 嗯,首先,这是 WebApi,而不是 MVC。 WebApi 可能随 MVC4 一起提供,但它们是两种不同的技术。其次,如果您展示了您的控制器操作以及如何返回数据,这可能会有所帮助。
  • @ErikFunkenbusch:谢谢!我已经更新了问题并从我的解决方案中提取了相关的控制器源代码。
  • 查看这篇博文。它可能会有所帮助。 emadibrahim.com/2014/04/09/…
  • 您可能会发现这很有用gist.github.com/eed3si9n/4554127

标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api json.net


【解决方案1】:

您可能可以这样做,将您的对象包装在具有客户属性的父对象中,尽管我尚未对其进行测试:

var mycust = new { customers = customer };
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, mycust);

或者您可以使用自定义格式化程序,如以下要点:

https://gist.github.com/eed3si9n/4554127

【讨论】:

    猜你喜欢
    • 2017-03-17
    • 2020-11-25
    • 1970-01-01
    • 2016-08-11
    • 2019-04-30
    • 1970-01-01
    • 2014-08-13
    • 2016-07-28
    • 1970-01-01
    相关资源
    最近更新 更多