Как перегрузить JSON в asp.net MVC для пользовательских результатов - PullRequest
1 голос
/ 17 января 2011

Я хочу создать специальный формат json для всех действий, которые возвращают результат Json. Я хотел бы сделать что-то вроде этого:

//Returning content, ok status, etc.
{value: { name: "Lol coder", id : "2"} }

//If exception
{exception : {loc: "MyProj.Web.AuthController", type: "email_not_found", email: "lolCoder@hotmail.com"}}

Надеюсь, это понятно.

ASP.NET MVC Action:

private bool noError = true; //used to switch between throwing error or not
public ActionResult GetUser(string email)
{
    if(Request.IsAjax())
    {
        User user = new User{ name = "Lol", id = "2" };
        if(noError)
            return Json(new { value = user }
        else
            //How do I make this better?
            return Json(new { exception = new { loc = /*this assembly*/"", type = Status.EmailNotFound, email = email});
    }
    //Not really meant for non ajax calls, so no idea what to do here.
    return View();

}

Мне в основном нужно создать 2 стандарта, если нет ошибки, то это идет в value объект, если ошибка, он использует структуру исключения.

Ответы [ 2 ]

0 голосов
/ 17 января 2011

Как насчет создания двух методов, либо на базовом контроллере, либо в качестве методов расширения:

public JsonResult JsonValue(object value)
{
    if (!Request.IsAjax())
        throw new InvalidOperationException("This action is only available to JSON requests");
    return Json(new { value; });
}

public JsonResult JsonError(Exception ex)
{
    if (!Request.IsAjax())
        throw new InvalidOperationException("This action is only available to JSON requests");
    // whatever formatting you need
    return Json(new { exception = new { ex.ToString(); });
}

Тогда в вашем методе действий:

public ActionResult GetUser(string email)
{
    try {
        var user = GetUser();
        return JsonValue(user);
    } catch (Exception ex) {
        return JsonError(ex);
    }
}

Вы могли бы сделать свои методы действий еще проще, определив пользовательский ActionFilterAttribute, который проверяет исключения и устанавливает результат ошибки JSON, тогда вам нужно будет только добавить [JsonError] или что-то еще в метод действия, а не попробовать / ловить блок.

0 голосов
/ 17 января 2011

То, что у вас есть, это самый простой способ получить результаты в формате JSON. Альтернативой может быть использование словарей, но они становятся более многословными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...