从angular向c#api控制器发送数据绑定到错误操作
问题: 为什么我的操作“添加”被命中而不是“删除”操作 错误消息: “ExceptionMessage”:“发现多个操作与 请求:加载项类型blog.Controllers.api.UsersController删除 键入blog.Controllers.api.UsersController 我的角度删除从angular向c#api控制器发送数据绑定到错误操作,c#,angularjs,asp.net-mvc-5.2,C#,Angularjs,Asp.net Mvc 5.2,问题: 为什么我的操作“添加”被命中而不是“删除”操作 错误消息: “ExceptionMessage”:“发现多个操作与 请求:加载项类型blog.Controllers.api.UsersController删除 键入blog.Controllers.api.UsersController 我的角度删除 $scope.delete = function (email) { $http.post('/api/users/Delete', email).success(func
$scope.delete = function (email) {
$http.post('/api/users/Delete', email).success(function() {
initData();
});
}
替代测试
//$http({
// url: '/api/users/Delete',
// method: 'POST',
// data: { 'userEmail': email }
// })
// .success(function(data, status, headers, config) {
// initData();
// }).
// error(function(data, status, headers, config) {
// $scope.showError = true;
// });
我的MVC5API控制器
private readonly UserDataAccess _userDataAccess;
// GET: Users/Add
[HttpPost]
public HttpResponseMessage Add(User user)
{
_userDataAccess.AddUser(user);
return Request.CreateResponse(HttpStatusCode.OK);
}
// GET: Users/Delete - never gets hit
[HttpPost]
public HttpResponseMessage Delete([FromBody]string userEmail)
{
_userDataAccess.DelereUserByEmail(userEmail);
return Request.CreateResponse(HttpStatusCode.OK);
}
请注意,我不想使用路由解决此问题。在WebApi中,每个路由只能有一个POST操作。为了使控制器类有多个POST操作,您需要定义新路由 如果您使用的是WebApi 2,则可以从
RoutingAttribute
中获益,并定义这些新的子路由
在控制器类中使用RoutePrefixAttributte
:
[RoutePrefix('api/users')]
public class Users: ApiController{ ...
然后是您的2个子路线:
[Route('add')]
[HttpPost]
public HttpResponseMessage Add(User user){..
[Route('delete')]
[HttpPost]
public HttpResponseMessage Delete([FromBody]string userEmail) {
关于路线的信息
Web Api v1在应用程序启动事件的global.asax中全局定义资源。假设您使用的是Visual Studio 2013,并且基于Microsoft的默认模板,您的方法可能如下所示:
WebApi路由配置发生在此处WebApiConfig.Register
,而MVC配置发生在此处RouteConfig.registerOutes
您的WebApi路由配置应该如下所示
public static class WebApiConfig{
public static void Register(HttpConfiguration config){
config.Routes.MapHttpRoute(
name: "apiSample",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
...
如前所述,WebApi v2引入了路由属性,这些属性可与控制器类一起使用,并可促进路由配置
例如:
public class BookController : ApiController{
//where author is a letter(a-Z) with a minimum of 5 character and 10 max.
[Route("html/{id}/{newAuthor:alpha:length(5,10)}")]
public Book Get(int id, string newAuthor){
return new Book() { Title = "SQL Server 2012 id= " + id, Author = "Adrian & " + newAuthor };
}
[Route("json/{id}/{newAuthor:alpha:length(5,10)}/{title}")]
public Book Get(int id, string newAuthor, string title){
return new Book() { Title = "SQL Server 2012 id= " + id, Author = "Adrian & " + newAuthor };
}
...
你也可以用类似的问题参考另一篇文章
您也可以手动配置路由您可以在Api控制器中的delete方法上添加
[HttpDelete]
属性,然后使用调用它
[HttpDelete]
public IHttpActionResult Delete(string email) {
return StatusCode(HttpStatusCode.NoContent);
}
引用…的文件
表示用于限制操作方法的属性,以便该方法仅处理HTTP DELETE请求
您是否尝试过使用
ActionName
并在默认路由之前向操作添加路由?thnx对于回答,这将非常有效,但我不希望在每个操作上都有特定的路由,因为这很难维护。
[HttpPost]
[Route('api/User/Delete/{userEmail}')]
public HttpResponseMessage Delete([FromBody]string userEmail)
{
}
[HttpDelete]
public IHttpActionResult Delete(string email) {
return StatusCode(HttpStatusCode.NoContent);
}