无法从ASP.NET MVC中的IEnumerable获取JSON

时间:2016-02-23 18:03:35

标签: c# json asp.net-mvc

问题是我无法从IEnumerable中获得正确的答案JSON,这很奇怪,因为我通过MVC控制器的自动JSON响应做了很多次。

所以这是课程:

public class Error
{
    public Error(string key, string message)
    {
        Key = key;
        Message = message;
    }

    private string Key { get; set; }
    private string Message { get; set; }
}

扩展名:

public static class ModelStateHelper
{
    public static IEnumerable<Error> ErrorsDictionary(this ModelStateDictionary modelState)
    {
        if (modelState.IsValid) return null;
        var result = from ms in modelState
            where ms.Value.Errors.Any()
            let fieldKey = ms.Key
            let errors = ms.Value.Errors
            from error in errors
            select new Error(fieldKey, error.ErrorMessage);
        return result;
    }
}

最后这里是控制器:

[HttpPost]
public async Task<ActionResult> Add(PermissionsViewModel model)
{
    if (!ModelState.IsValid)
    {
        var errors = ModelState.ErrorsDictionary();
        return Json(new {HttpStatusCode = HttpStatusCode.BadRequest, errors});
    }
    var result = await _ps.Create(model);
    return Json(result);
}

我收到的答案是:"errors":[{},{}]}而不是错误信息。

1 个答案:

答案 0 :(得分:3)

这是因为在大多数序列化框架中,默认情况下,属性的范围是私有属性并不是序列化的(*旁注)。您可以将它们公开,如果您确实需要添加私有的setter。这样状态就会被序列化。

public class Error
{
    public Error(string key, string message)
    {
        Key = key;
        Message = message;
    }

    public string Key { get; set; }
    public string Message { get; set; }

    // option 2 is with private setter but commented out
    /*public string Key { get; private set; }
    public string Message { get; private set; }*/
}
  • 附注( from above ) - 在某些框架中,您可以指定它仍应序列化私有字段。你也没有提到你用于JSON序列化的内容,所以我不能告诉你是否可以在配置中改变这种行为。