Web API未填充参数对象 在研究了大量文章(最具体的是:Complex type is getting null in a ApiController parameter但其他文章)后,我得到了以下代码,将一个对象参数从AngularJS $ Resource工厂传递给ASP.NET Web API(C#)控制器。 (最终搜索对象会更复杂,但为了简单起见,我减少了属性数量)
型号:
public class SearchModel
{
public long ClientId { get; set; }
public string EmployeeName { get; set; }
public string FromDate { get; set; }
public string ToDate { get; set; }
}
AngularJS工厂
(function () {
'use strict';
angular
.module('mainApp')
.factory('searchService', searchService);
searchService.$inject = ['$resource', 'baseApiUrl'];
function searchService($resource, baseApiUrl) {
return $resource(baseApiUrl + "api/Search", null, {
query: { method: "Get", url: baseApiUrl + "api/Search/Get:searchModel", params: { searchModel: '@searchModel' }, isArray: true }
});
})
();
执行此代码时会生成此URI:
https://localhost:44300/api/Search/Get?clientId=4&fromDate=3%2F1%2F2016&EmployeeName=Bob&toDate=3%2F30%2F2016
请求被路由到以下SearchController:
[RoutePrefix("api/Search")]
public class SearchController : BaseController
{
//this c’tor contains all the necessary code to implement ninject bindings etc.
public SearchController(…): base(…)
{…}
#if !DEBUG
[Authorize] //note: this allows me to execute from Fiddler w/o an auth token
#endif
[HttpGet]
[Route("{searchModel}")]
public IHttpActionResult Get([FromUri] SearchModel searchModel)
{
try
{
//Here is where I am breaking the execution to test the results:
// search model “Is” (not null) but all properties of object ARE null strings or 0 (the long)
var result = _searchQuery.Get(searchModel);
return this.GetResult(result);
}
catch (Exception ex)
{
return InternalServerError(ex);
}
}
}
当我在上面提到的点进入breakmode时,立即窗口告诉我“请求”查询字符串按预期完成...
为什么我的传递值未填充在控制器的 SearchModel 对象中。
[编辑:在接受回答后我需要添加角度控制器以获得有效的解决方案]
控制器
(function () {
'use strict';
angular
.module('mainApp')
.controller('SearchController', SearchController);
SearchController.$inject = ['$filter', 'searchService'];
function SearchController($filter, searchService) {
var vm = this;
vm.searchModel = {
fromDate: "3/1/2016",
toDate: "3/30/2016",
clientId: 4,
employeeName: "Bob"
}
vm.data = searchService.query(vm.searchModel);
}})();
(注意'接下来'我计划使用绑定来填充这些值...但我希望很容易实现......除了日期...... ...
答案 0 :(得分:2)
如果希望查询字符串参数绑定到复杂对象,则需要在每个查询参数前面加上处理控制器方法中参数的名称。
在你的情况下:
static void setProdStatusStarted(Args _args)
{
ProdUpdStartUp prodUpdStartUp;
ProdParmStartUp prodParmStartUp;
ProdParametersDim prodParametersDim;
ProdTable prodTable;
ProdId prodId = "PROD-0001";
prodTable = ProdTable::find(prodId);
ttsBegin;
prodParmStartUp.initValue();
prodParmStartUp.initParmDefault();
prodParametersDim = ProdParametersDim::find(prodTable.InventDimId);
prodParmStartUp.initFromProdParametersDim(prodParametersDim);
prodParmStartUp.ProdId = prodTable.ProdId;
prodParmStartUp.PostNowBOM = NoYes::No;
//CompletePickListJournal property allows it to create additional picking list journals which are missing for the BOM.
prodParmStartUp.CompletePickListJournal = NoYes::Yes;
prodParmStartUp.insert();
ttsCommit;
prodUpdStartUp = ProdUpdStartUp::construct();
prodUpdStartUp.parmParmBuffer(prodParmStartUp);
prodUpdStartUp.run();
}