无法将参数传递给 Visual Studio 中的控制器(2019 v)

Unable to pass parameter to the Controller in Visual Studio (2019 v)

我目前无法将参数从我创建的方法传递给控制器​​。当我 运行 它手动使用邮递员中的参数时,一切正常。

如何将参数传递给控制器​​?有什么方法可以将其设置为自动路由,而不是根据不同的参数创建单独的路由?这是一个非常基本的应用程序。

错误信息: {"Message":"找不到与请求 URI 'https://localhost:44364/api/WebInterface/RemoveNurse' 匹配的 HTTP 资源。","MessageDetail":"在控制器 'WebInterface' 上找不到与请求匹配的操作。"}

控制器:

using WebInterfaceAPI.Helpers;
using WebInterfaceAPI.Services;
using WebInterfaceAPI.Models;
using Newtonsoft.Json;
using System.Data.SqlClient;
using System.Web.Http;
using System.Net;

namespace WebInterfaceAPI.Controllers
{
    public class WebInterfaceController : ApiController
    {
        private NurseService NurseService { get; set; }

        public WebInterfaceController()
        {
            NurseService = new NurseService();
        }

        #region Nurse Actions
        /// <summary>
        /// Removes specified nurse
        /// </summary>
        /// <param name="nurseID"></param>
        /// <returns></returns>
        [HttpPost]
        public IHttpActionResult RemoveNurse(int nurseID)
        {
            APIResponseModel result = NurseService.removeNurse(nurseID);
            if (result.IsSuccess)
            {
                return Ok(result.Message);

            }
            else
            {
                return Content(HttpStatusCode.BadRequest, result.Message);
            }
        }

        #endregion
    }
};

RouteConfig.cs

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

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

方法:(NurseService.cs)

public APIResponseModel removeNurse(int nurseID)
        {
            using (var dbContext = new DataBase())
            {
                OnCallNurses_Nurses rowToDelete = (from nurse in dbContext.OnCallNurses_Nurses
                                                   where nurse.id == nurseID
                                                   select nurse).SingleOrDefault();

                if (rowToDelete == null)
                {
                    return new APIResponseModel(false, "Cannot delete nurse.");
                }
                else
                {
                    dbContext.OnCallNurses_Nurses.Remove(rowToDelete);
                    dbContext.SaveChanges();
                    return new APIResponseModel(true, "Nurse successfully removed.");
                }
            }
        }

前端

function removeNurse(nID) {

$('#loader').removeClass('d-none');
var webMethod = "https://localhost:44364/api/WebInterface/RemoveNurse";
// var webMethod = "https://webinterface.com/api/api/WebInterface/RemoveNurse";

$.ajax({
    type: "POST",
    url: webMethod,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    data: {
        nurseID: nID
    },
    success: function (data) {
        alert(data);
        // $(nurseRow).remove();
        $('#loader').addClass('d-none');

    },
    error: function (xhr, status) {
        console.log(xhr.responseText);
        console.log(xhr.status);
    }
});
};

您必须修复 url 并从 ajax

中删除 contentType 和类型

$.ajax({
        type: "POST",
        url:  "https://localhost:44364/api/WebInterface/RemoveNurse",
        data: {
            nurseID: nID
        },
......
});

并更改操作 header:

[Route("~/api/WebInterface/RemoveNurse")]
 public IHttpActionResult RemoveNurse(int nurseID)

或更换您的控制器header

[Route("api/[controller]/[action]")]
public class WebInterfaceController : ApiController

并将属性路由添加到配置中:

 routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();

但更好的方法是使用路由传递 id


$.ajax({
        url:  "https://localhost:44364/api/WebInterface/RemoveNurse/"+nID,
        success: function (data) 
......
});

在这种情况下,操作将是

[Route("~/api/WebInterface/RemoveNurse/{nurseId}")]
 public IHttpActionResult RemoveNurse(int nurseID)