【问题标题】:Web API Route config not firing by angularjs with multiple parametersWeb API Route 配置未由具有多个参数的 angularjs 触发
【发布时间】:2017-10-06 06:32:01
【问题描述】:

请检查我的 WebApiConfig、API 控制器和角度服务。第一条路线工作正常,但第二条和第三条没有被 angularjs 调用。虽然 web api 路由没问题。

--WebApiConfig

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {

        config.Formatters.Remove(config.Formatters.XmlFormatter);

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{param}",
            defaults: new { param = RouteParameter.Optional }
        );
        config.Routes.MapHttpRoute(
            name: "Api2",
            routeTemplate: "api/{controller}/{action}/{param1}/{param2}",
            defaults: new { param1 = RouteParameter.Optional, param2 = RouteParameter.Optional }
        );
        config.Routes.MapHttpRoute(
            name: "Api3",
            routeTemplate: "api/{controller}/{action}/{param1}/{param2}/{param3}",
            defaults: new { param1 = RouteParameter.Optional, param2 = RouteParameter.Optional, param3 = RouteParameter.Optional }
        );
    }
}

--Web API 控制器

[HttpPost]
public IHttpActionResult InsertAcademicInfo(AcademicInformation[] param1, AcademicResult[] param2)
{
     return Ok(_academic.InsertAcademicInformation(param1, param2).Data);
}

--Angular 服务

mainApp.factory('AcademicServices', ['$http', '$rootScope', function ($http, $rootScope) {
  return {
    Save: function (academic, results) {
        return $http({
            url: '/Api/ApiAcademic/InsertAcademicInfo',
            method: 'POST',
            data: { param1: academic, param2: results },
            async: false
        });
    },
  };
}]);

【问题讨论】:

  • 根据您的路线api/{controller}/{action}/{param1}/{param2}param1param2 应该出现在 URL 中。但是在您的 Http POST 中,url 是 api/ApiAcademic/InsertAcademicInfo 并且参数在帖子正文中,所以这不起作用!您能否包括控制器的其余部分并说明哪些操作有效,哪些无效?
  • Api/ApiAcademic/Details(int param) -- 参数(在第一条路线上工作正常) Api/ApiAcademic/InsertAcademicInfo(AcademicInformation[] param1, AcademicResult[] param2) -- 不工作跨度>

标签: c# asp.net angularjs asp.net-web-api asp.net-web-api-routing


【解决方案1】:

这不是post 在 Web API 中的工作方式。您发送的内容与您的预期不符。如果你想通过消息体发送数据,你需要发送一个对象,这个对象可能很复杂。这是您当前在 angular/javascript 调用中所做的,但不是您在 web api 方法中所期望的。如下更改您的 web api 以完成此操作。

此外,您确实应该使用路由属性,而不是尝试创建一个单一的路由表来容纳所有控制器上的所有路由。使用RouteAttributeRoutePrefixAttribute。此外,您在下面的方法中不需要任何参数,因为您使用请求消息正文而不是 URI 发送数据。

AcademicInfoModel.cs

public class AcademicInfoModel {
    public AcademicInformation[] param1 {get;set;}
    public AcademicResult[] param2 {get;set;}
}

ApiAcademicController.cs

[RoutePrefix("api/ApiAcademic")]
public class ApiAcademicController : ApiController
{

    [HttpPost]
    [Route("InsertAcademicInfo")]
    public IHttpActionResult InsertAcademicInfo(AcademicInfoModel model)
    {
         return Ok(_academic.InsertAcademicInformation(model.param1, model.param2).Data);
    }
}

【讨论】:

  • 但我认为这是一个复杂的解决方案,尽管在 jquery 中我已经研究过了。
  • 我需要发送数据url。
  • @sebu - 你为什么要这样做?如果它是原子值/简单类型(如字符串、int 等),那么使用 URI 就可以了,但在 POST 上,在消息正文中发送的数组中包含复杂数据是非常可取的。
猜你喜欢
  • 2014-02-04
  • 2019-04-30
  • 1970-01-01
  • 2015-07-22
  • 2018-07-05
  • 2018-09-04
  • 1970-01-01
  • 2019-07-28
  • 2012-10-01
相关资源
最近更新 更多