Как вернуть данные Json из контроллера MVC в C # - PullRequest
0 голосов
/ 10 ноября 2018

Я использую шаблон репозитория с Entity Framework. Когда я запускаю свой код вместо данных Json, я получаю -> System.Collections.Generic.List`1 [MovieInfo.Core.Models.Models.User]

Репозиторий

public interface IRepository<T> where T : class
{
    IEnumerable<T> Get();

    T GetDetails(Guid Id);

    void Insert(T data);

    void Delete(T data);

    void Update(T data);

    void Save();
}

public GenericRepository()
        {
            context = new Entities();
            dbEntity = context.Set<T>();
        }

Услуги

public class TestService : ITestService
    {
        public TestService(
           IRepository<User> userRepository
           )
        {
            _userRepository = userRepository;
        }

        private readonly IRepository<User> _userRepository;

        public IEnumerable<User> Get()
        {

            var result = _userRepository.Get();

            return result;
        }
    }

Контроллер

public class HomeController : Controller
{
    public HomeController(ITestService testService)
    {
        _testService = testService;
    }

    private readonly ITestService _testService;

    public IEnumerable<User> Index()
    {
        var result = _testService.Get();

        return result;
    }
}

Я нашел здесь какое-то решение (StackOverflow), в котором мне нужно добавить WebApiConfig, я добавил, как показано ниже, но оно также не работает.Я получаю вывод System.Collections.Generic.List`1 [MovieInfo.Core.Models.Models.User]

 public static class WebAppConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Formatters.Remove(new XmlMediaTypeFormatter());

        config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

        config.Formatters.XmlFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("multipart/form-data"));

        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new
            {
                id = RouteParameter.Optional
            }
        );
    }
}

Вот моя ссылка на репозиторий Git https://github.com/Harshk16/MovieInfo

Пожалуйста, помогите мне, как получить вывод в формате Json

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Чтобы использовать веб-API, который вы определяете в WebApiConfig, ваши контроллеры должны наследоваться от базового контроллера Web-API ApiController вместо базового контроллера MVC controller.

При наследовании от ApiController, Formatter по умолчанию позаботится о том, чтобы вывод методов вашего контроллера соответствовал вашему желаемому результату. В вашем случае, когда вы удалили Xml-форматер, по умолчанию будет Json.

public class HomeController : ApiController
{
    public HomeController(ITestService testService)
    {
        _testService = testService;
    }

    private readonly ITestService _testService;

    public IEnumerable<User> Index()
    {
        var result = _testService.Get();

        return result;
    }
}
0 голосов
/ 10 ноября 2018

Если вы хотите вернуть ответ JSON из вашего метода действия контроллера MVC, вы можете использовать метод Json.

Метод Json определен внутри System.Web.Mvc.Controller, от которого вы наследуете HomeController. Таким образом, у вас есть доступ к этому методу.

Метод Json возвращает JsonResult typw. Поэтому убедитесь, что тип возвращаемого значения вашего метода - JsonResult или ActionResult. (JsonResult класс наследует от ActionResult)

public JsonResult Index()
{
    var result = _testService.Get();
    return Json(result,JsonRequestBehavior.AllowGet);
}

Или

public ActionResult Index()
{
    var result = _testService.Get();
    return Json(result,JsonRequestBehavior.AllowGet);
}

Другой вариант - использовать контроллер веб-API вместо контроллера MVC. Зарегистрируйте ваши веб-интерфейсы API до того, как ваш метод действия MVC будет использоваться в вашем global.asax.cs

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    GlobalConfiguration.Configure(WebAppConfig.Register);

    RouteConfig.RegisterRoutes(RouteTable.Routes);

    // Your other existing code
}

и создайте контроллер webapi, который наследуется от System.Web.Http.ApiController. Здесь я удалил часть Inpendency Injection для простоты. Вы можете подключить DI к своим контроллерам веб-API, следуя Руководству по интеграции веб-API AutoFac

public class UsersController : ApiController
{
    public IEnumerable<User> Get()
    {
        var result = new List<User>
        {
            new User { Id = Guid.NewGuid() , DisplayName = "Shyju"},
            new User { Id = Guid.NewGuid(), DisplayName = "Scott"}
        };
        // Hard coded list of users. 
        // Once you fix your DI setup, you can use your service to get data.
        return result;
    }
}

По умолчанию в веб-интерфейсе используется согласование содержимого. Он считывает значение заголовка запроса «Принять» и на основании этого выполняет соответствующий модуль форматирования. Используя текущий шаблон веб-API-маршрутизации , вы можете получить доступ к этой конечной точке с помощью приведенного ниже URL-адреса запроса

http://yourSiteBaseUrl/api/users/get

Если вы не хотите указывать get в URL-адресах API, просто исправьте шаблон маршрута при регистрации маршрутизации веб-API

routeTemplate: "api/{controller}/{id}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...