Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这个jQuery没有调用我的REST方法?_C#_Jquery_Ajax_Rest_Controller - Fatal编程技术网

C# 为什么这个jQuery没有调用我的REST方法?

C# 为什么这个jQuery没有调用我的REST方法?,c#,jquery,ajax,rest,controller,C#,Jquery,Ajax,Rest,Controller,我有一个类似的问题,关于jQuery按钮点击处理程序代码根本没有被触发 在本例中,它被激发(当jQuery被添加到静态页面(Index.cshtml)时),但是我的REST方法仍然没有被到达。解释原因的控制台消息是: The resource cannot be found. Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed,

我有一个类似的问题,关于jQuery按钮点击处理程序代码根本没有被触发

在本例中,它被激发(当jQuery被添加到静态页面(Index.cshtml)时),但是我的REST方法仍然没有被到达。解释原因的控制台消息是:

The resource cannot be found.

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly. 

Requested URL: /LandingPage/GetQuadrantData

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.6.1055.0
这是jQuery,当单击按钮时确实会触发它,但不会进行REST调用:

<script>
    $(function () {
        var btnGetData = document.getElementById('btnGetData');
        btnGetData.addEventListener("click", function () {
            alert("It works");
            var unitval = 'ABUELOS';
            var begdateval = '2016-08-07';
            var enddateval = '2016-08-13';

            $.ajax({
                type: 'GET',
                url: '@Url.Action("GetQuadrantData", "LandingPage")',
                data: { unit: unitval, begdate: begdateval, enddate: enddateval },
                contentType: 'application/json',
                cache: false,
                success: function (returneddata) {
                },
                error: function () {
                    alert('hey, boo-boo!');
                }
            });
        });
    });
</script>
我在“_unit=unit;”行上有一个断点,但未到达该断点;为什么不呢?我错过了什么

讨论中的REST控制器类是这样开始的:

[RoutePrefix("api")]
public class LandingPageController : ApiController
注意:如果我在jQuery中使用此选项(“附加控制器”):

…在IDE(Visual Studio)编辑器中,“GetQuadrantData”和“LandingPageController”均为红色-字母为红色

OTOH,如果我使用这个(附加了sans“Controller”):

(这在过去对我有效,将“Controller”从控制器名称中去掉),“GetQuadrantData”和“LandingPage”都用红色下划线,但字体仍保持正常颜色

更新 使用Nico在下面评论中的链接,我将jQuery“url”行更改为:

url: '@Url.Action("GetQuadrantData", "LandingPage", new { httproute = "" })',
…但它仍然没有导致到达控制器方法

更新2 通过(Chrome)浏览器中的javascript,我看到“url”行已从设计时的状态动态更改:

url: '@Url.Action("GetQuadrantData", "LandingPage", new { httproute = "" })',
…致:

url: '/api/LandingPage?action=GetQuadrantData',
我认为应该解决的问题更像是:

url: '/api/ABUELOS/2016-08-14/2016-08-20',
我说得对吗?为什么不这样解决呢

如果我在浏览器中手动输入该URL,则URL栏将显示“
http://localhost:52194/api/ABUELOS/2016-08-21/2016-08-27
“它起作用了——达到了方法,它“做了自己的事。”

更新3 我也试过这个:

$(function () {
    $("#btnGetData").click(function () {
        document.body.style.cursor = 'wait';
        $.ajax({
            type: "GET",
            url: '@Url.Action("GetQuadrantData", "LandingPage")',
            success: function (retval) {
                $("body").append($(retval));
                document.body.style.cursor = 'pointer';
            },
            error: function () {
                alert('error in btnGetData');
            }
        }); // end AJAX
    }); // end click
}); // end ready function
…但只看到“btnGetData中的错误”

更新4 我最近的失败是:

$("#btnGetData").click(function () {
    document.body.style.cursor = 'wait';
    var unitval = $('#unitName').val();
    var begdateval = $('#datepickerFrom').val();
    var enddateval = $('#datepickerTo').val();
    $.ajax({
        type: 'GET',
        url: '@Url.Action("GetQuadrantData", "LandingPage")',
        data: { unit: unitval, begdate: begdateval, enddate: enddateval },
        cache: false,
        success: function (returneddata) {
            alert($(returneddata));
        },
        error: function () {
            alert('error in ajax');
        }
    });
});
同样,我只看到“ajax中的错误”

更新5 注意:任何能解决这一难题的人都将获得最高奖金(我想是200分)。如果不止一个人这样做了,那么悬赏就属于解决问题最好的人(对我来说,这基本上意味着以最直接、最容易实现的方式)

出于充分披露和绝望的考虑,以下是WEB API应用程序运行时显示的第一页的全部内容(无聊/无意义的部分用省略号省略)(从\Views\Home\Index.cshtml:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>eServices Reporting - Customer Dashboard</title>
    <!-- Latest compiled and minified CSS -->
    <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">

    <!-- jQuery library -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

    <!-- Latest compiled JavaScript -->
    <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
    <!--[if IE]>
        <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->

    <style>
        body {
            padding-top: 20px;
            padding-bottom: 20px;
            background-color: white;
        }
    . . .
    </style>
    <script>
    $(function () {
        $("#btnGetData").click(function () {
            document.body.style.cursor = 'wait';
            var unitval = "ABUELOS"; //$('#unitName').val();
            var begdateval = $('#datepickerFrom').val();
            var enddateval = $('#datepickerTo').val();
            $.ajax({
                type: 'GET',
                url: '@Url.Action("GetQuadrantData", "LandingPage")',
                data: { unit: unitval, begdate: begdateval, enddate: enddateval },
                cache: false,
                success: function (returneddata) {
                    alert($(returneddata));
                },
                error: function () {
                    alert('error in ajax');
                }
            });
        });

    }); // end ready function
    </script>
</head>

<body>
    <div class="container body-content">
        <div class="jumbotronjr">
            <div class="col-md-3" style="margin-top: 0.6cm">
                <img src="http://www.proactusa.com/wp-content/themes/proact/images/pa_logo_notag.png" height="86" width="133" alt="PRO*ACT usa logo">
            </div>
            <div class="col-md-9">
                <label class="titletext" style="margin-top: 0.2cm;">Customer Dashboard</label>
                <br />
                <label class="titletextjr" style="margin-top: -2.2cm;" id="unitName">Craftworks</label>
                <label class="cccsfont"> for the week of August 14          </label>
                <input class="smalldatepicker" type="date" id="datepickerFrom" name="daterangefrom" value="2016-08-14">
                </input>
                <label class="cccsfont"> to </label>
                <input type="date" class="smalldatepicker" id="datepickerTo" name="daterangeto" value="2016-08-20">
                </input>
                <button class="btn green smallbutton" id="btnGetData" name="btnGetData">SUBMIT</button>
            </div>
        </div>    

        <div class="row">
            <div class="col-md-12">
                <hr />
            </div>
        </div>    

        <div class="row">
            <div class="col-md-12">
            </div>
        </div>

        <div class="row">
            <div class="col-md-6">
                <div class="topleft">
                    <h2 class="sectiontext">Top 10 Items Purchased</h2>

                    <table>
                        <tr>
                            <th>Item Code</th>
                            <th>Description</th>
                            <th class="rightjustifytext">Qty</th>
                        </tr>
                        <tr>
                            <td>101200</td>
                            <td>ASPARAGUS, STANDARD 11/1#</td>
                            <td class="rightjustifytext">32</td>
                        </tr>
                        <tr>
                            <td>140200</td>
                            <td>MUSHROOMS, MEDIUM 10#</td>
                            <td class="rightjustifytext">20</td>
                        </tr>
                        <tr>
                            <td>140000</td>
                            <td>MUSHROOMS, BUTTON 10#</td>
                            <td class="rightjustifytext">14</td>
                        </tr>
                        <tr>
                            <td>127100</td>
                            <td>LETTUCE, ROMAINE 24 CT </td>
                            <td class="rightjustifytext">14</td>
                        </tr>
                        <tr>
                            <td>300123</td>
                            <td>BEANS, GREEN TRIM 2/5# (BAGS)</td>
                            <td class="rightjustifytext">13</td>
                        </tr>
                        <tr>
                            <td>173100</td>
                            <td>POTATOES,  50 CT IDAHO</td>
                            <td class="rightjustifytext">12</td>
                        </tr>
                        <tr>
                            <td>234225</td>
                            <td>BERRIES, STRAWBERRY 1# CLAM</td>
                            <td class="rightjustifytext">11</td>
                        </tr>
                        <tr>
                            <td>188500</td>
                            <td>TOMATOES, GRAPE 12/1 PT</td>
                            <td class="rightjustifytext">10</td>
                        </tr>
                        <tr>
                            <td>122500</td>
                            <td>LETTUCE, ICEBERG LINER 24 CT</td>
                            <td class="rightjustifytext">10</td>
                        </tr>
                        <tr>
                            <td>121050</td>
                            <td>LETTUCE, GREEN LEAF 24 CT</td>
                            <td class="rightjustifytext">10</td>
                        </tr>
                    </table>
                </div>
            </div>

            <div class="col-md-6">
                <div class="topright">
                    <h2 class="sectiontext">Pricing Exceptions - Weekly Recap</h2>
                    <label class="redfont cccs">Red denotes Contract Item Overages</label>
                    </br>
                    <label class="cccs">For Weyand on the pricing week of - 7/31/2016</label>
                    <table>
                        <tr>
                            <th>PRO*ACT Member</th>
                            <th class="rightjustifytext">Total Occurrences of Summary Items</th>
                            <th class="rightjustifytext">Total Summary Exceptions</th>
                            <th class="rightjustifytext">Total Percentage of Summary Exceptions</th>
                        </tr>
                        <tr>
                            <td style="width:30%">Stern</td>
                            <td style="width:23%" class="rightjustifytext">205</td>
                            <td style="width:23%" class="rightjustifytext">2</td>
                            <td style="width:24%" class="rightjustifytext">99.02%</td>
                        </tr>
                        <tr>
                            <td>Hardies Dallas</td>
                            <td class="rightjustifytext">1,597</td>
                            <td class="rightjustifytext">0</td>
                            <td class="rightjustifytext">100.00%</td>
                        </tr>
                        <tr>
                            <td>Hardies South</td>
                            <td class="rightjustifytext">612</td>
                            <td class="rightjustifytext">1</td>
                            <td class="rightjustifytext">99.84%</td>
                        </tr>
                        <tr>
                            <td>Go Fresh</td>
                            <td class="rightjustifytext">482</td>
                            <td class="rightjustifytext">0</td>
                            <td class="rightjustifytext">100.00%</td>
                        </tr>
                        <tr>
                            <td>Segovias</td>
                            <td class="rightjustifytext">1,360</td>
                            <td class="rightjustifytext">2</td>
                            <td class="rightjustifytext">99.85%</td>
                        </tr>
                        <tr>
                            <td>Potato Spec</td>
                            <td class="rightjustifytext">1,605</td>
                            <td class="rightjustifytext">0</td>
                            <td class="rightjustifytext">100.00%</td>
                        </tr>
                        <tr>
                            <td class="rightjustifytext bold">TOTAL</td>
                            <td class="rightjustifytext bold">5,861</td>
                            <td class="rightjustifytext bold">5</td>
                            <td class="rightjustifytext bold">99.79%</td>
                        </tr>
                    </table>
                </div>
            </div>
        </div>

        <div class="row">
            <div class="col-md-6">
                <div class="bottomleft">
                    <h2 class="sectiontext">Forecasted Spend - $9,814.81</h2>
                    <table>
                        <tr>
                            <th>Item Code</th>
                            <th class="rightjustifytext">Last Week's Usage</th>
                            <th class="rightjustifytext">This Week's Price</th>
                            <th class="rightjustifytext">Forecasted Spend</th>
                        </tr>

                        <tr>
                            <td>261650</td>
                            <td class="rightjustifytext">49</td>
                            <td class="rightjustifytext">3.14</td>
                            <td class="rightjustifytext">153.86</td>
                        </tr>
                        <tr>
                            <td>231083</td>
                            <td class="rightjustifytext">52</td>
                            <td class="rightjustifytext">1.25</td>
                            <td class="rightjustifytext">65.00</td>
                        </tr>
                        <tr>
                            <td>398980</td>
                            <td class="rightjustifytext">46</td>
                            <td class="rightjustifytext">4.95</td>
                            <td class="rightjustifytext">227.70</td>
                        </tr>
                        <tr>
                            <td>351135</td>
                            <td class="rightjustifytext">40</td>
                            <td class="rightjustifytext">0.75</td>
                            <td class="rightjustifytext">30.00</td>
                        </tr>
                        <tr>
                            <td>398036</td>
                            <td class="rightjustifytext">42</td>
                            <td class="rightjustifytext">3.00</td>
                            <td class="rightjustifytext">126.00</td>
                        </tr>
                        <tr>
                            <td>208110</td>
                            <td class="rightjustifytext">42</td>
                            <td class="rightjustifytext">2.50</td>
                            <td class="rightjustifytext">105.00</td>
                        </tr>
                        <tr>
                            <td>102800</td>
                            <td class="rightjustifytext">1835</td>
                            <td class="rightjustifytext">2.25</td>
                            <td class="rightjustifytext">4,128.75</td>
                        </tr>
                        <tr>
                            <td>367050</td>
                            <td class="rightjustifytext">1910</td>
                            <td class="rightjustifytext">1.95</td>
                            <td class="rightjustifytext">3,724.50</td>
                        </tr>
                        <tr>
                            <td>173100</td>
                            <td class="rightjustifytext">66</td>
                            <td class="rightjustifytext">19.00</td>
                            <td class="rightjustifytext">1,254.00</td>
                        </tr>
                        <tr>
                            <td class="bold">TOTAL</td>
                            <td class="bold rightjustifytext">4082</td>
                            <td class="bold rightjustifytext">--</td>
                            <td class="bold rightjustifytext">$9,814.81</td>
                        </tr>
                    </table>
                </div>
            </div>

            <div class="col-md-6">
                <div class="bottomright">
                    <h2 class="sectiontext">Delivery Performance</h2>
                    <table>
                        <tr>
                            <th>PRO*ACT Distributor</th>
                            <th>Restaurant Location</th>
                            <th class="rightjustifytext">Avg Order Amount</th>
                            <th class="rightjustifytext">Avg Package Count</th>
                            <th class="rightjustifytext">Total Sales</th>
                        </tr>

                        <tr>
                            <td>Sunrise FL</td>
                            <td>A1A ALEWORKS - #4405 - ST. AUGUSTINE</td>
                            <td class="rightjustifytext">$475.78</td>
                            <td class="rightjustifytext">28.50</td>
                            <td class="rightjustifytext">$1,903.10</td>
                        </tr>
                        <tr>
                            <td>Sunrise FL</td>
                            <td>RAGTIME TAVERN - #4404 - ATLANTIC BEACH</td>
                            <td class="rightjustifytext">$221.46</td>
                            <td class="rightjustifytext">17.50</td>
                            <td class="rightjustifytext">$885.82</td>
                        </tr>
                        <tr>
                            <td>Sunrise FL</td>
                            <td>SEVEN BRIDGES - #4403 - JACKSONVILLE</td>
                            <td class="rightjustifytext">$367.49</td>
                            <td class="rightjustifytext">22.67</td>
                            <td class="rightjustifytext">$1,102.47</td>
                        </tr>
                        <tr>
                            <td>T&T</td>
                            <td>BIG RIVER - #4201 - CHATTANOOGA</td>
                            <td class="rightjustifytext">$396.06</td>
                            <td class="rightjustifytext">22.83</td>
                            <td class="rightjustifytext">$2,376.34</td>
                        </tr>
                        <tr>
                            <td>T&T</td>
                            <td>BIG RIVER - #4205 - HAMILTON PL</td>
                            <td class="rightjustifytext">$424.74</td>
                            <td class="rightjustifytext">26.00</td>
                            <td class="rightjustifytext">$1,698.95</td>
                        </tr>
                        <tr>
                            <td class="bold">TOTAL</td>
                            <td></td>
                            <td class="bold rightjustifytext">3,770.42</td>
                            <td class="bold rightjustifytext">23.50</td>
                            <td class="bold rightjustifytext">$1,592.60</td>
                        </tr>
                    </table>
                </div>
            </div>
        </div>

    </div>

</body>
</html> 

…有帮助,因为我的方法中的断点正在到达。不幸的是,它发出了“SyntaxError:Unexpected token<在JSON中的位置0”

只有当jQuery需要完整的url来完成请求时,您才给它控制器和操作名。此外,您的端点有一个“api”前缀。您需要url属性类似:{port}/api/{controller}/{action}如果您的服务器在本地运行。

只有当jQuery需要完整的url来完成请求时,您才给它控制器和操作名称。此外,您的端点有一个“api”前缀。您需要url属性类似:{port}/api/{controller}/{action}如果您的服务器在本地运行。

您在如何生成路由以及如何尝试访问路由方面遇到一些问题

您的Web API操作正在使用属性路由,因此默认情况下没有与基于约定的路由中的路由名称相匹配的路由

更新路由属性以包含要在路由表中查找的名称

[RoutePrefix("api")]
public class LandingPageController : ApiController {

    [HttpGet]
    [Route("{unit}/{begdate}/{enddate}", Name="QuadrantData")]
    public HttpResponseMessage GetQuadrantData(string unit, string begdate, string enddate) {
        _unit = unit;
        _beginDate = begdate;
        _endDate = enddate;
        //...other code
    }

    //...other code
}
接下来,即使您有名称,您也需要包含模板参数,以便从MVC获得匹配,并让它在您在操作中定义的模板中生成url

要生成指向Web API的链接,如下所示

@Url.RouteUrl(routeName : "QuadrantData", routeValues : new { httpRoute = true , unit = "ABUELOS", begdate = "2016-08-07", enddate = "2016-08-13"  })

这会将
httpRoute
添加到路由值中

参考:

现在,由于您的方法已被排除,我建议采用以下替代方法

KISS原则。将Web API(REST)端点更改为POST并更改其模板

[RoutePrefix("api")]
public class LandingPageController : ApiController {

    //eg POST api/QuadrantData
    [HttpPost]
    [Route("QuadrantData", Name="GenerateQuadrantData")]
    public HttpResponseMessage QuadrantData(string unit, string begdate, string enddate) {
        _unit = unit;
        _beginDate = begdate;
        _endDate = enddate;
        //...other code
    }

    //...other code
}
并在JSON POST请求的主体中发送数据

$(function () {
    $("#btnGetData").click(function () {
        document.body.style.cursor = 'wait';
        var unitval = "ABUELOS"; //$('#unitName').val();
        var begdateval = $('#datepickerFrom').val();
        var enddateval = $('#datepickerTo').val();

        var jsonBody = JSON.stringify({ unit: unitval, begdate: begdateval, enddate: enddateval });

        $.ajax({
            type: 'POST',
            url: '@Url.HttpRouteUrl("GenerateQuadrantData", null)',
            contentType: 'application/json',
            dataType: 'json',
            data: jsonBody,
            cache: false,
            success: function (returneddata) {
                alert($(returneddata));
            },
            error: function () {
                alert('error in ajax');
            }
        });
    });

}); // end ready function

您在如何生成路由以及如何尝试访问路由方面存在一些问题

您的Web API操作正在使用属性路由,因此默认情况下没有与基于约定的路由中的路由名称相匹配的路由

更新路由属性以包含要在路由表中查找的名称

[RoutePrefix("api")]
public class LandingPageController : ApiController {

    [HttpGet]
    [Route("{unit}/{begdate}/{enddate}", Name="QuadrantData")]
    public HttpResponseMessage GetQuadrantData(string unit, string begdate, string enddate) {
        _unit = unit;
        _beginDate = begdate;
        _endDate = enddate;
        //...other code
    }

    //...other code
}
接下来,即使您有名称,您也需要包含模板参数,以便从MVC获得匹配,并让它在您在操作中定义的模板中生成url

要生成指向Web API的链接,如下所示

@Url.RouteUrl(routeName : "QuadrantData", routeValues : new { httpRoute = true , unit = "ABUELOS", begdate = "2016-08-07", enddate = "2016-08-13"  })

这会将
httpRoute
添加到路由值中

参考:

现在,由于您的方法已被排除,我建议采用以下替代方法

KISS原则。将Web API(REST)端点更改为POST并更改其模板

[RoutePrefix("api")]
public class LandingPageController : ApiController {

    //eg POST api/QuadrantData
    [HttpPost]
    [Route("QuadrantData", Name="GenerateQuadrantData")]
    public HttpResponseMessage QuadrantData(string unit, string begdate, string enddate) {
        _unit = unit;
        _beginDate = begdate;
        _endDate = enddate;
        //...other code
    }

    //...other code
}
并在JSON POST请求的主体中发送数据

$(function () {
    $("#btnGetData").click(function () {
        document.body.style.cursor = 'wait';
        var unitval = "ABUELOS"; //$('#unitName').val();
        var begdateval = $('#datepickerFrom').val();
        var enddateval = $('#datepickerTo').val();

        var jsonBody = JSON.stringify({ unit: unitval, begdate: begdateval, enddate: enddateval });

        $.ajax({
            type: 'POST',
            url: '@Url.HttpRouteUrl("GenerateQuadrantData", null)',
            contentType: 'application/json',
            dataType: 'json',
            data: jsonBody,
            cache: false,
            success: function (returneddata) {
                alert($(returneddata));
            },
            error: function () {
                alert('error in ajax');
            }
        });
    });

}); // end ready function

就个人而言,我不太喜欢在javascript代码中使用@Url.Action;我就是这样调用ajax的:

  • 在布局页面中创建隐藏字段以存储根url-
  • 有一个常量json文件来保存客户端常量(constants.js)-将隐藏字段值分配给
    serviceRoot
    变量:

    (function () {
    window.constants = {
    
        serviceRoot: $("#hdnRoot").val() + "api/",
        objectState: {
            added: "Added",
            modified: "Modified",
            unchanged: "Unchanged",
            deleted: "Deleted"
        },
       ..other values...
    };
    })();
    
  • 将修改您的ajax调用,如下所示:

    var root = window.constants.serviceRoot;
    $.ajax({
                type: 'GET',
                url: root + 'LandingPage/GetQuadrantData/'+unitval+'/'+begdateval+'/'+enddateval,
              //  data: { unit: unitval, begdate: begdateval, enddate: enddateval },
                contentType: 'application/json',
                cache: false,
                success: function (returneddata) {
                },
                error: function () {
                    alert('hey, boo-boo!');
                }
            });
    
     [RoutePrefix("api")]
     public class LandingPageController : ApiController {
    
       [HttpGet]
       [Route("GetQuadrantData/{unit}/{begdate}/{enddate}", Name="GetQuadrantDataFromLandingPage")]
       public HttpResponseMessage GetQuadrantData(string unit, string begdate, string enddate) 
    

我个人不太喜欢在javascript代码中使用@Url.Action;我就是这样调用ajax的:

  • 在布局页面中创建隐藏字段以存储根url-
  • 有一个常量json文件来保存客户端常量(constants.js)-将隐藏字段值分配给
    serviceRoot
    变量:

    (function () {
    window.constants = {
    
        serviceRoot: $("#hdnRoot").val() + "api/",
        objectState: {
            added: "Added",
            modified: "Modified",
            unchanged: "Unchanged",
            deleted: "Deleted"
        },
       ..other values...
    };
    })();
    
  • 将修改您的ajax调用,如下所示:

    var root = window.constants.serviceRoot;
    $.ajax({
                type: 'GET',
                url: root + 'LandingPage/GetQuadrantData/'+unitval+'/'+begdateval+'/'+enddateval,
              //  data: { unit: unitval, begdate: begdateval, enddate: enddateval },
                contentType: 'application/json',
                cache: false,
                success: function (returneddata) {
                },
                error: function () {
                    alert('hey, boo-boo!');
                }
            });
    
     [RoutePrefix("api")]
     public class LandingPageController : ApiController {
    
       [HttpGet]
       [Route("GetQuadrantData/{unit}/{begdate}/{enddate}", Name="GetQuadrantDataFromLandingPage")]
       public HttpResponseMessage GetQuadrantData(string unit, string begdate, string enddate) 
    

好的,此解决方案解决了您的问题,但意味着您的代码中有一些更改:

在视图中,当您调用
Url.Action
时,您正在尝试
var url = '@Url.RouteUrl(new
      {
          unit = "(unit)",
          begdate = "(begdate)",
          enddate = "(enddate)",
          httproute = true
      })'

url = url.replace("(unit)", unitval)
         .replace("(begdate)", begdateval)
         .replace("(enddate)", enddateval)

$.ajax({
    type: 'GET',
    url: url,
    contentType: 'application/json',
    cache: false,
    success: function (returneddata) {
    },
    error: function () {
        alert('hey, boo-boo!');
    }
});
[RoutePrefix("api")]
public class LandingPageController : ApiController
{
    [Route("{unit}/{begdate}/{enddate}", Name = "QuadrantData")]
    public HttpResponseMessage GetQuadrantData(string unit, string begdate, string enddate)
    {
        ...
var url = '@Url.RouteUrl("QuadrantData", new
      {
          unit = "(unit)",
          begdate = "(begdate)",
          enddate = "(enddate)",
          httproute = true
      })'
 $("#btnGetData").click(function () {

   var unitval = 'ABUELOS';
   var begdateval = '2016-08-21';
   var enddateval = '2016-08-27';

   $.getJSON("api/" + unitval + "/" + begdateval + "/" + enddateval,
      function (Data) {
        // do what ever you want with the success response
      })
      .fail(
        function (jqXHR, textStatus, err) {
          // do what ever you want with the failed response
      });
 });