1

在 MVC4 中通过 API 控制器返回 JSON 数据的正确方法是什么?我听说您需要将变量类型用作函数,但是我不能这样做,因为.Select(x => new { })那时我不能使用。

我所做的是dynamic像这样使用

[HttpGet]
public dynamic List() // Not List<Item>
{
    var items = _db.Items.OrderBy(x => x.ID).Select(x => new
    {
        ID = x.ID,
        Title = x.Title,
        Price = x.Price,
        Category = new {
            ID = x.Category.ID,
            Name = x.Category.Name
        }
    });

    return items;
}

这是最好的方法吗?我在问,因为我刚开始使用 MVC4,我不想过早养成坏习惯 :)

4

2 回答 2

3

内置函数Controller.Json( MSDN ) 可以做你想做的事,即假设你的代码驻留在控制器类中:

[HttpGet]
public dynamic List() // Not List<Item>
{
    var items = _db.Items.OrderBy(x => x.ID).Select(x => new
    {
        ID = x.ID,
        Title = x.Title,
        Price = x.Price,
        Category = new {
            ID = x.Category.ID,
            Name = x.Category.Name
        }
    });

    return Json(items, JsonRequestBehavior.AllowGet);
}

如果您想在 GET 请求中使用它,那么您应该使用接受JsonRequestBehavior标志作为参数并指定JsonRequestBehavior.AllowGet该参数的重载。

于 2012-09-04T10:38:51.570 回答
1

您不需要使用dynamic,简单的方法是返回object匿名类型:

[HttpGet] 
public object List() // Not List<Item> 
{ 
    var items = _db.Items.OrderBy(x => x.ID).Select(x => new 
    { 
        ID = x.ID, 
        Title = x.Title, 
        Price = x.Price, 
        Category = new { 
            ID = x.Category.ID, 
            Name = x.Category.Name 
        } 
    }); 

    return items; 
}

或者,返回HttpResponseMessage

[HttpGet] 
public HttpResponseMessage List() // Not List<Item> 
{ 
    var items = _db.Items.OrderBy(x => x.ID).Select(x => new 
    { 
        ID = x.ID, 
        Title = x.Title, 
        Price = x.Price, 
        Category = new { 
            ID = x.Category.ID, 
            Name = x.Category.Name 
        } 
    }); 

    return Request.CreateResponse(HttpStatusCode.OK, items);
}
于 2012-09-04T10:45:22.100 回答