问题是我无法从 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/