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

标签 c# json asp.net-mvc

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

所以这是类(class):

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;
    }
}

最后是 Controller :

[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":[{},{}]} 而不是错误信息。

最佳答案

这是因为您的属性被限定为私有(private)属性,并且私有(private)属性在大多数序列化框架中默认不会被序列化(*旁注)。如果您确实需要添加私有(private) 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; }*/
}

  • 旁注(从上面) - 在某些框架中,您可以指定它仍然应该序列化私有(private)字段。您也没有提及您用于 JSON 序列化的内容,因此我无法告诉您是否可以在配置中更改此行为。

关于c# - 无法从 ASP.NET MVC 中的 IEnumerable 获取 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35584919/

相关文章:

json - 在 npm install 期间出现 Failed to parse package.json data

c# - TryUpdateModel 和 System.MissingMethodException

javascript - 流程图 : Adding Checkbox's to Toggle Chart Series

javascript - 如果启用了 javascript,如何执行 Ajax 请求,否则,请求将通过 POSTBACK?

c# - 从多个线程访问这个变量是否安全?

C# 将文本包装在列表框中

c# - onclick 方法在 Blazor 服务器端 Razor 组件中不起作用

c# - 如何以编程方式将电子书发布到 Kindle、Sony Reader 等?

Python 从响应 JSON 中读取特定数据

php - 如何在 CakePHP 中为 JSON 返回正确的内容类型?