在Razor视图中显示来自Web API控制器的json

本文关键字:API Web 控制器 json Razor 视图 显示 | 更新日期: 2023-09-27 18:06:45

我正在做一个asp.net MVC 5应用程序。我创建了一个返回药物列表的Web API 2控制器。现在我想把它们显示给视图。我创建了另一个名为homecontroller的控制器和索引动作方法(因为我认为api控制器不能有动作方法)。我创建了索引视图。在这个视图中,我想展示药物清单。我点击了这个链接http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

我正在尝试这个代码:

var uri = '/api/Medicines';
$(document).ready(function () {
    // Send an AJAX request
    $.getJSON(uri)
        .done(function (data) {
            // On success, 'data' contains a list of products.
            $.each(data, function (key, item) {
                // Add a list item for the product.
                $('<li>', { text: formatItem(item) }).appendTo($('#products'));
            });
        });
});

但是在浏览器控制台中得到404。

这是Web APi控制器方法:

public class MedicinesController : ApiController
{
    public IEnumerable<Medicine> GetMedicines()
    {
        Random rnd = new Random();
        return medicines.OrderBy(x => rnd.Next()).ToList();
    }
}

路由配置为:

public static void Register(HttpConfiguration config)
{
    config.MapHttpAttributeRoutes();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

请建议如何解决这个问题。我需要json格式的药品列表。

谢谢

在Razor视图中显示来自Web API控制器的json

链接'/api/Medicines'如果路由配置类似于

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

但如果你是这样的(教程中有两个版本)

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

你还必须在uri '/api/Medicines/Medicines'中指定Action name。

更新

我用WebApi创建了新的MVC 5项目,一切都工作得很好,没有任何问题和hack。

如果你有标准路由配置,不使用任何区域等,你的uri应该是

var uri = '/Medicines/GetMedicines'

正如Joanvo所说,您可能需要allowGet设置作为返回。这样的:

return Json(medicines.OrderBy(x => rnd.Next()), JsonRequestBehavior.AllowGet);