无法将参数传递给 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)
我目前无法将参数从我创建的方法传递给控制器。当我 运行 它手动使用邮递员中的参数时,一切正常。
如何将参数传递给控制器?有什么方法可以将其设置为自动路由,而不是根据不同的参数创建单独的路由?这是一个非常基本的应用程序。
错误信息: {"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)