Web API未填充参数对象

时间:2016-03-30 19:08:49

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

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);
}})();

(注意'接下来'我计划使用绑定来填充这些值...但我希望很容易实现......除了日期...... ...

1 个答案:

答案 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();
}