如何从Web API控制器方法AS JSON返回ViewModel?

时间:2015-08-30 17:18:49

标签: json asp.net-mvc-5 asp.net-web-api2

我的Controller方法被成功调用,视图模型加载数据,但在返回时抛出错误。

public AccountManagerViewModel Get(string id)
{
    AccountManagerViewModel account = new AccountManagerViewModel(Guid.Parse(id));

    return account;
}

我尝试将[Serializable]属性添加到类中,但没有运气。

我正在做的事情有意义吗?我们希望在新的Web API应用程序中重用我们的MVC应用程序中的尽可能多的代码,因此我们真的不希望创建新的类,我们必须从ViewModel手动填充并从Web API控制器方法返回。

2 个答案:

答案 0 :(得分:0)

你真的需要看看错误是什么。也许GUID不正确?格式不正确或只是不退出?

这应该工作得很好。要记住的一件事是不要使用递归等序列化复杂模型。这可能是您可能遇到的另一个错误。 (但你也可以禁用递归序列化)

检查错误的最佳方法是在Chrome / Firefox中打开开发人员控制台并启用XMLHttpRequest日志记录。然后在控制台中,您可以单击红色响应并查看ASP.NET中的错误。

enter image description here

另一种检查代码是否被命中的方法是在代码的第一行放置一个断点,使其命中并运行客户端。然后,您还可以逐行检查错误的位置。

您可以对实体框架模型进行深入的讨论。

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = 
    Newtonsoft.Json.PreserveReferencesHandling.None;

答案 1 :(得分:0)

我知道这是一个古老的问题,但是希望答案会为寻找相同事物的人提供价值...

我认为您真正想做的是返回一个HTTP响应,其中包含ViewModel的序列化版本。如果将方法的返回类型更改为IHttpActionResult,则可以使用内置的WebAPI函数来返回结果,包括自动序列化的ViewModel。

这看起来类似于以下内容。

public IHttpActionResult Get(string id)
{
    AccountManagerViewModel account = new AccountManagerViewModel(Guid.Parse(id));

    return Ok(account);
}

您也可以使用其他内置函数来返回不同的HTTP响应。例如

public IHttpActionResult Get(string id)
{
    if (string.IsNullOrWhiteSpace(id)) return BadRequest("Empty id parameter"); 

    AccountManagerViewModel account = new AccountManagerViewModel(Guid.Parse(id));

    if (account is null) return NotFound();

    return Ok(account);
}