首页 > 解决方案 > 使用 Asp.net Web Api 时面临的问题,详细信息如下:

问题描述

我创建了带有两个控制器的 Web Api 应用程序,第一个是HomeController我在其中创建了名为的操作ApiDataView并创建了该操作的视图并调用了另一个名为的操作,GetNames在该操作中我在另一个名为的控制器中创建了该操作,我在View中APITESTController调用它但是单击按钮时,我无法获取此操作的值。GetNames List<string>ApiDataViewGetNames

我的代码:

Home控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace My_Work.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
        [HttpGet]
        public ActionResult ApiDataView()
        {
            return View();
        }
    }
}

APITest控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace My_Work.Controllers
{
    public class APITestController : ApiController
    {
        public List<string> GetNames()
        {
            List<string> names = new List<string>() { "Zeeshan", "Uzair", "Nouman" };
            return names;
        }
    }
}

ApiDataView看法:

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>APIDataView</title>
    <script> src="~/Scripts/jquery-1.7.1.js" </script>
</head>
<body>
    <div>
        <input type="button" id="btn1" value="Show Name" />
        <ul id="nl">
            <li>ABC</li>
        </ul>
    </div>
</body>
</html>
<script>
    $("#btn1").click(function () {
        $("#nl").empty();
        $.getJSON("api/APITest/GetNames", function (data) {
            $.each(data, function (id,val) {
                $("#nl").append("<li>" + val + "</li>");
            });
        });
    });
</script>

WebApiConfigApp_Start 文件夹:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace My_Work
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            var xmlType =
                config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
                config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(xmlType);
        }
    }
}

RouteConfigApp_Start 文件夹:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace My_Work
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "ApiDataView", id = UrlParameter.Optional }
            );
        }
    }
}

这是我获取GetNames操作值的代码:

<script>
    $("#btn1").click(function () {
        $("#nl").empty();
        $.getJSON("api/APITest/GetNames", function (data) {
            $.each(data, function (id,val) {
                $("#nl").append("<li>" + val + "</li>");
            });
        });
    });
</script>

输出:

在此处输入图像描述

现在点击按钮我无法获得GetNames行动的价值。任何帮助表示赞赏。

标签: c#asp.net-web-apiweb-applicationscontroller

解决方案


您给出的路径是相对的,这意味着它将在当前 URL 之后附加您的路径“api/APITest/GetNames”,因此创建的请求路径是“/Home/api/APITest/GetNames”,它不存在,这就是你得到的原因404 错误(检查浏览器的控制台)。要解决此问题,请提供类似"/api/APITest/GetNames"的路径以使其绝对意味着从"/api"开始。

$.getJSON("/api/APITest/GetNames", function (data) {});

推荐阅读