Иметь в качестве возможных результатов Json actionresult и HttpStatusCodeResult, но только один результат - PullRequest
0 голосов
/ 26 апреля 2018

Мне нравится разрабатывать свои методы только с одним оператором return по разным причинам (я считаю это наилучшей практикой).

Но как мне сделать, чтобы в результате действия контроллера mvc был создан объект результата, в который я могу поместить как HttpStatusCodeResult, так и обычный результат Json?

Оба они наследуются от ActionResult.

Edit: Пример того, что я имею сейчас, но хотел бы изменить только на 1 инструкцию return, будет выглядеть так:

public ActionResult Test(string inputString = "stack")
{
    try
    {
        int carrots = int.Parse(inputString);
        return Json(new { Data = carrots }, JsonRequestBehavior.AllowGet);
    }
    catch (Exception)
    {
        return new HttpStatusCodeResult(400);
    }
}

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Вы можете наследовать и расширять класс JsonResult, который добавляет код статуса Http.

public class JsonHttpStatusResult : JsonResult
{
    private readonly HttpStatusCode _httpStatus;

    public JsonHttpStatusResult(object data, HttpStatusCode httpStatus)
    {
        Data = data;
        _httpStatus = httpStatus;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        context.RequestContext.HttpContext.Response.StatusCode = (int)_httpStatus;
        base.ExecuteResult(context);
    }
}

Теперь вы можете использовать его как обычный Jsonresult в условиях отсутствия ошибок, а в условиях ошибок это может быть:

var errorModel = new { error = "There was an error" };
    return new JsonHttpStatusResult(errorModel, HttpStatusCode.InternalServerError);
0 голосов
/ 27 апреля 2018

Вы просто отправляете код ответа вместе с вашим ответом:

Response.StatusCode = Convert.ToInt32(System.Net.HttpStatusCode.InternalServerError);

return Json(new { Data = carrots }, JsonRequestBehavior.AllowGet);
0 голосов
/ 26 апреля 2018

Если вам действительно нужно одно возвращение, простой способ сделать это примерно так:

public ActionResult SomeMethod()
{
    ActionResult result;
    try
    {
        result = TryGetTheCorrectResult();
    }
    catch
    {
        result = MakeSomeHttpStatusCodeResult();
    }
    return result;
}

Это действительно вопрос вкуса, находишь ли ты это "лучше", чем

public ActionResult SomeMethod()
{
    try
    {
        return TryGetTheCorrectResult();
    }
    catch
    {
        return MakeSomeHttpStatusCodeResult();
    }
}

Более короткие методы с меньшим количеством локальных переменных также могут способствовать повышению качества кода, но, думаю, все зависит от вкуса.

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