asp.net mvc json.net ответ - PullRequest
       14

asp.net mvc json.net ответ

2 голосов
/ 17 февраля 2011

Я впервые внедряю Json.NET для своего сайта ASP.NET MVC2.

Мой оригинальный код выглядел так:

[HttpPost]
public ActionResult FindMe(string searchFirstName, string searchLastName)
{
    this.searchFirstName = searchFirstName;
    this.searchLastName = searchLastName;
    IEnumerable<HomePageUser> results = doSearch();
    bool success = (results.Count() == 0) ? false : true;

    return Json(new
    {
        success = success,
        results = results
    });
}

Результаты были проблематичными из-за того, что одним из элементов в наборе результатов является Enum, и я действительно хочу значение Text, а не числовое. Кроме того, формат даты является проблемой.

Итак, я нашел Json.NET и изменил свой код так:

[HttpPost]
public JsonNetResult FindMe(string searchFirstName, string searchLastName)
{
    this.searchFirstName = searchFirstName;
    this.searchLastName = searchLastName;
    IEnumerable<HomePageUser> results = doSearch();
    bool success = (results.Count() == 0) ? false : true;

    JsonNetResult jsonNetResult = new JsonNetResult();
    jsonNetResult.SerializerSettings.Converters.Add(new IsoDateTimeConverter());
    jsonNetResult.Data = results;// how to add success true/false info?

    return jsonNetResult;
}

Это устраняет две вышеупомянутые проблемы, но теперь мне интересно, как сделать это без проблем с моим существующим кодом JavaScript, который ожидал, что json будет выглядеть так:

{
    "success":true,
    "results":[{
        "UserId":545,
        "FirstName":"Scott",
        "LastName":"Roberson"}]
}

Это позволило мне сначала проверить на response.success, прежде чем приступить к записи ответа, вместо того, чтобы перейти в раздел для обработки ошибок.

Итак, мой вопрос: как добавить успешный узел json верхнего уровня, чтобы он располагался рядом с узлом результатов?

Спасибо.

UPDATE:

Как это часто бывает, акт написания вопроса породил идею в одной из этих Дох! моменты.

, если я добавлю:

var returnPackage = new { success = success, results = results};

затем добавьте это в jsonNetResult.Data примерно так:

jsonNetResult.Data = returnPackage;

Отлично работает.

Спасибо, в любом случае.

Финальный код:

[HttpPost]
public JsonNetResult FindMe(string searchFirstName, string searchLastName)
{
    this.searchFirstName = searchFirstName;
    this.searchLastName = searchLastName;
    IEnumerable<HomePageUser> results = doSearch();
    bool success = (results.Count() == 0) ? false : true;

    var returnPackage = new { success = success, results = results};

    JsonNetResult jsonNetResult = new JsonNetResult();
    jsonNetResult.SerializerSettings.Converters.Add(new IsoDateTimeConverter());
    jsonNetResult.Data = returnPackage;

    return jsonNetResult;
}

1 Ответ

2 голосов
/ 17 февраля 2011

Вот что я делаю в своих приложениях MVC / Ajaxy. Определите новый класс:

public class JsonResultData
{
    private bool _success = true;
    public bool Success
    {
        get { return _success; }
        set { _success = value; }
    }

    public object Value { get; set; }
    public List<string> Errors { get; set; }

    public JsonResultData()
    {
        this.Errors = new List<string>();
    }
}

Затем установите значение возвращаемых данных:

jsonNetResult.Data = new JsonResultData { Value = results };

Свойство JsonResultData.Success - это то, что вы хотите сначала протестировать в ответе json. По умолчанию используется значение true, но если в методе на стороне сервера что-то идет не так, вы устанавливаете значение false и добавляете сообщение об ошибке, например:

    catch (Exception ex)
    {
        List<string> errors = new List<string>();
        errors.Add(ex.ToString());
        jsonNetResult.Data = new JsonResultData { Success = false, Errors = errors };
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...