【问题标题】:getJSON doesnt call webAPI methodgetJSON 不调用 Web API 方法
【发布时间】:2013-09-24 06:54:02
【问题描述】:

我是 mvc 4 和 webAPI 的新手,我正在开发我的第一个应用程序。它是单页应用程序并使用 Knockoutjs。我使用此演练https://github.com/geersch/KnockoutSpa/
我的 webAPI 方法一切正常,当我使用 Fiddler 调用方法时它返回正确的值。但是当我从 getJson() 方法使用它时它从未调用过。这是我的 HTML:

    <table id="nqsales" class="table table-striped table-hover table-condensed">
    <thead>
        <tr>
            <th>A</th>
            <th>B</th>
            <th>C</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: viewModel.nqsales">
        <tr>
            <td data-bind="text: a"></td>
            <td data-bind="text: b"></td>
            <td data-bind="text: c"></td> 
        </tr>
    </tbody>
    </table>

Javascript

$(function () {
    ko.applyBindings(viewModel);
    viewModel.loadNqsales();
});

var viewModel = {
    nqsales: ko.observableArray([]),

    loadNqsales: function () {
        var self = this;
        $.getJSON(
            '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "NQSale" })',
    function (nqsales) {
        self.nqsales.removeAll();
        $.each(nqsales, function (index, item) {
            self.nqsales.push(new nqsale(item));
        });
    }
);
    }
};

function nqsale(nqsale) {
    this.expenceFormNo = ko.observable(nqsale.a);
    this.orderNo = ko.observable(nqsale.b);
    this.date = ko.observable(nqsale.c);
}

WebAPI控制器

    // GET api/NQSale
    public IEnumerable<NQSaleDto> GetNQSales()
    {
        //return db.NQSales.AsEnumerable();
        return db.NQSales
            .AsEnumerable()
            .Select(nqlist => new NQSaleDto(nqlist));
        
    }

【问题讨论】:

    标签: c# javascript asp.net-mvc-4 knockout.js asp.net-web-api


    【解决方案1】:

    你的Url构造

    @Url.RouteUrl("DefaultApi", new { httproute = "", controller = "NQSale" })

    应该生成一个 '/api/NQSale' 的 URL,这意味着你的控制器应该如下:

    //The controller name relates to the route
        public class NQSaleController : ApiController
    {
    // The action name relates to the HttpVerb
        public IEnumerable<NQSaleDto> Get()
        {
            //return db.NQSales.AsEnumerable();
            return db.NQSales
                .AsEnumerable()
                .Select(nqlist => new NQSaleDto(nqlist));
    
        }
    }
    

    默认情况下,API 的路由是控制器的名称(NQSaleController)与路径相关,Action 的名称(Get)与 HttpVerb 相关。

    【讨论】:

      【解决方案2】:

      我猜你的 Url 没有正确生成。如果当前视图中的 Javascript 或在单独的文件中? @Url 只有在视图中才有效。

      【讨论】:

      • @Url 在视图中,它似乎生成正确。它是我在 firebug 中看到的:loadNqsales: function () { var self = this; $.getJSON('/api/NQSale', function (nqsales) { self.nqsales.removeAll(); $.each(nqsales, function (index, item) { self.nqsales.push(new nqsale(item)); }); }
      猜你喜欢
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多