簡體   English   中英

無法從ASP.NET MVC中的IEnumerable獲取JSON

[英]Can't get JSON from IEnumerable in 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":[{},{}]}而不是錯誤信息。

這是因為您的屬性的作用域為私有,而私有屬性在大多數序列化框架中都沒有默認序列化(*旁注)。 您可以將它們公開,如果您確實需要添加一個私人二傳手。 這樣狀態將被序列化。

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

  • 旁注( 從上方 )-在某些框架中,您可以指定它仍應序列化私有字段。 您也沒有提到用於JSON序列化的內容,因此我無法告訴您是否可以在配置中更改此行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM