2016-02-23 2 views
2

Проблема в том, что я не могу получить правильный ответ JSON для анализа из IEnumerable, что очень странно по той причине, что я сделал это много раз с помощью автоматического ответа JSON от контроллера MVC.Невозможно получить JSON из IEnumerable в ASP.NET MVC

Так вот класс:

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":[{},{}]} вместо информации об ошибках.

+0

Нет, это не путь. –

ответ

3

Это связано с тем, что ваши свойства ограничены как частные, так и частные свойства по умолчанию не сериализованы в большинстве схем сериализации (* side note). Вы можете сделать их общедоступными, и если вам действительно нужно добавить частные сеттеры. Таким образом, состояние будет сериализовано.

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

  • Side Примечание (сверху) - В некоторых структурах можно указать, что он должен еще сериализовать приватные поля. Вы также не упоминаете, что вы используете для сериализации JSON, поэтому я не могу сказать вам, можете ли вы изменить это поведение в конфиге или нет.
+1

Черт! Это так просто! –

Смежные вопросы