1

請檢查我的WebApiConfig,API控制器和角度服務。第一條路線工作正常,但第二和第三條不是由angularjs調用。雖然web api路線沒問題。Web API路由配置沒有被多個參數的angularjs觸發

--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 
     }); 
    }, 
    }; 
}]); 
+0

根據你的路線'API/{控制器}/{行動}/{參數1}/{參數2}' :'param1'和'param2'應該存在於URL中。然而,在你的Http POST中,url是'api/ApiAcademic/InsertAcademicInfo',並且這些參數在post body中,所以這不起作用!你可以包括你的控制器的其餘部分,並提到哪些行動工作,哪些不行? – degant

+0

Api/ApiAcademic/Details(int param) - param(其中第一個路由正常工作) Api/ApiAcademic/InsertAcademicInfo(AcademicInformation [] param1,AcademicResult [] param2) - 不工作 – sebu

回答

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); 
    } 
} 
+0

但我認爲這是一個複雜解決方案,但在jQuery中我已經在它上面工作。 – sebu

+0

我需要發送數據網址。 – sebu

+0

@sebu - 你爲什麼要那樣做?如果它的原子值/簡單類型(如字符串,整型等)使用URI很好,但是在郵件正文中發送數組中的複雜數據的POST是非常受歡迎的。 – Igor