繁体   English   中英

ASP.Net MVC Web Api函数针对完全不同的调用返回错误

[英]ASP.Net MVC Web Api Function returning error for entirely different call

我有以下Api控制器:

public class FamilyController : ApiController
{
    ApplicationDb db = new ApplicationDb();

    public IEnumerable<Family> GetFamilies()
    {
        return db.Families.AsNoTracking().OrderBy(n => n.FamilyName);
    }

    public Family GetFamily(int id)
    {
        return db.Families.AsNoTracking().Single(n => n.FamilyID == id);
    }
}

以下名为function.js的javascript文件

(function () {
window.dbApp = window.dbApp || {};

// Private: Routes
var familiesUrl = function () { return "/api/family/getfamilies" },
    familyUrl = function (id) { return "/api/family/getfamily?id=" + id };

// Private: Ajax helper
function ajaxRequest(type, url, data) {
    var options = { dataType: "json", contentType: "application/json", cache: false, type: type, data: ko.toJSON(data) }
    return $.ajax(url, options);
}

// Public: Methods
window.dbApp.Db = {
    getFamilies: function() {
        return ajaxRequest("get",familiesUrl());
    },
    getFamily: function (id) {
        return ajaxRequest("get", familyUrl(id));
    },
};

})();

并在视图上显示以下javascript:

@Scripts.Render("~/bundles/knockout")
@Scripts.Render("~/bundles/functions")    
<script type="text/javascript">
    function viewModel() {
        var self = this;
        self.Families = ko.observableArray([]);

        self.Init = function () {
            dbApp.Db.getFamilies()
                .done(function (data) {
                    self.Families(data);
                });
        };

        self.Init();
    }

    var model = new viewModel();
    ko.applyBindings(model);
</script>

但是我收到以下错误消息:参数字典包含空值类型为'System.Int32'的参数'id'的空条目,该类型为'MadcapsPortal.Controllers.FamilyController'中的'MadcapsPortal.Models.Family GetFamily(Int32)'方法的”。 可选参数必须是引用类型,可为空的类型,或者必须声明为可选参数。

就像调用了错误的函数一样。 奇怪的是,使用以下内容的另一个页面工作正常吗?

var passedId = @ViewBag.PassedID;
    function viewModel() {
        var self = this;
        self.Family = ko.observable();
        self.FamilyName = ko.observable();

        self.Init = function() {
            dbApp.Db.getFamily(passedId)
                .done(function(data){
                    self.Family(data);
                    self.FamilyName(data.FamilyName);                        
                });
        };

        self.Init();
    }

    var model = new viewModel();
    ko.applyBindings(model);

您应该使用以下URL:

  1. 对于列表资源,请使用GET /api/family
  2. 对于使用ID的资源,请使用GET /api/family/2GET /api/family?id=2

请阅读以下内容以获取有关ASP.NET Web API路由的更多信息:

但基本上:从URL到操作方法的映射主要取决于操作方法名称和方法签名中的HTTP方法和模式。 GET /api/family将映射到名称类似于get且不包含其他参数的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM