JsonResult возвращает Json в ASP.NET CORE 2.1

Контроллер, работавший в ASP.NET Core 2.0:

[Produces("application/json")]
[Route("api/[controller]")]
[ApiController]
public class GraficResourcesApiController : ControllerBase
{    
    private readonly ApplicationDbContext _context;

    public GraficResourcesApiController(ApplicationDbContext context)
    {
        _context = context;
    }

    [HttpGet]
    public JsonResult GetGrafic(int ResourceId)
    {
        var sheduling = new List<Sheduling>();


        var events = from e in _context.Grafic.Where(c=>c.ResourceId == ResourceId)
                     select new
                     {
                         id = e.Id,
                         title = e.Personals.Name,
                         start = e.DateStart,
                         end = e.DateStop,
                         color = e.Personals.Color,
                         personalId = e.PersonalId,
                         description = e.ClientName
                     };
        var rows = events.ToArray();

        return Json(rows);
    }
}

в ASP.NET Core 2.1

return Json (rows);

пишет, что Json не существует в текущем контексте. Если мы удалим Json, оставив просто

return rows;

затем пишет, что не удалось явно преобразовать тип List () в JsonResult

Как конвертировать в Json сейчас?


person blakcat    schedule 30.08.2018    source источник


Ответы (1)


В asp. net-core-2.1 ControllerBase не имеет Json(Object) метода. Однако Controller делает .

Так что либо реорганизуйте текущий контроллер, чтобы он был производным от Controller

public class GraficResourcesApiController : Controller {
    //...
}

чтобы иметь доступ к Controller.Json Method или вы можете инициализировать новый _ 7_ себя в действии

return new JsonResult(rows);

это в основном то, что метод делает внутри Controller

/// <summary>
/// Creates a <see cref="JsonResult"/> object that serializes the specified <paramref name="data"/> object
/// to JSON.
/// </summary>
/// <param name="data">The object to serialize.</param>
/// <returns>The created <see cref="JsonResult"/> that serializes the specified <paramref name="data"/>
/// to JSON format for the response.</returns>
[NonAction]
public virtual JsonResult Json(object data)
{
    return new JsonResult(data);
}

/// <summary>
/// Creates a <see cref="JsonResult"/> object that serializes the specified <paramref name="data"/> object
/// to JSON.
/// </summary>
/// <param name="data">The object to serialize.</param>
/// <param name="serializerSettings">The <see cref="JsonSerializerSettings"/> to be used by
/// the formatter.</param>
/// <returns>The created <see cref="JsonResult"/> that serializes the specified <paramref name="data"/>
/// as JSON format for the response.</returns>
/// <remarks>Callers should cache an instance of <see cref="JsonSerializerSettings"/> to avoid
/// recreating cached data with each call.</remarks>
[NonAction]
public virtual JsonResult Json(object data, JsonSerializerSettings serializerSettings)
{
    if (serializerSettings == null)
    {
        throw new ArgumentNullException(nameof(serializerSettings));
    }

    return new JsonResult(data, serializerSettings);
}

Источник

person Nkosi    schedule 30.08.2018
comment
Таким образом, обновление с 2.0 до 2.1 ломает существующий код. Кто-нибудь знает, почему они это изменили? - person WillC; 24.01.2019
comment
@WillC Я не могу сказать вам, почему они его изменили, но могу сказать, что одна из основных причин, по которым DNC лежала в основе, заключалась в том, что они могли что-то сломать. Быстрые итерации с небольшими обещаниями обратной совместимости. - person ernest; 31.01.2019
comment
Обратите внимание: если вы создаете API, в документации рекомендуется использовать не Controller, а ControllerBase. Справочные документы: Don't create a web API controller by deriving from the Controller class. Controller derives from ControllerBase and adds support for views, so it's for handling web pages, not web API requests. There's an exception to this rule: if you plan to use the same controller for both views and APIs, derive it from Controller. - person johnbt; 13.08.2019
comment
Это нормально, но возврат JSON - это фундаментальное действие API, поэтому кажется необычным, что он не принадлежит к тому классу, который они рекомендуют для API. - person ggorlen; 26.03.2020