【问题标题】:Why is my REST method not being called by this jQuery?为什么这个 jQuery 没有调用我的 REST 方法?
【发布时间】:2016-09-02 16:45:05
【问题描述】:

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

在这种情况下,它 正在 被触发(当 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>

REST 方法是这样设置的,在 LandingPageController.cs 中:

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

我在“_unit = unit;”上有一个断点线,但没有到达;为什么不?我在这里错过了什么?

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

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

注意:如果我在 jQuery 中使用它(“控制器”附加):

url: '@Url.Action("GetQuadrantData", "LandingPageController")'

...“GetQuadrantData”和“LandingPageController”在 IDE (Visual Studio) 编辑器中都是红色的 - 字母是红色的。

OTOH,如果我使用这个(没有附加“控制器”):

url: '@Url.Action("GetQuadrantData", "LandingPage")'

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

更新

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

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

...但它仍然没有导致到达 Controller 方法。

更新 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> 

更新 6

我知道 Arturo 的回答不止于此,但到目前为止只是添加以下内容:

config.Routes.MapHttpRoute(
    name: "QuadrantData",
    routeTemplate: "api/{unit}/{begdate}/{enddate}"
);

...有帮助,因为我的方法中的断点正在到达。不幸的是,它发出“SyntaxError: Unexpected token

【问题讨论】:

  • this answer 对您有帮助吗?
  • 我刚刚意识到您的路线中有其他参数。这些参数必须传递给Url.Action()。如果它们在渲染时不知道,您可以提供一些虚拟值,然后在 JS 中替换它们。
  • 不,data 是请求的附加包。但是您想将这些变量放入 URL 中。
  • 我会说只是连接网址片段。类似'@Request.Url.Authority' + 'api/' + unitval + '/' + begdateval + '/' + enddateval
  • SyntaxError: Unexpected token &lt; in JSON at position 0 似乎答案是 HTML 而不是 JSON。检查来自服务器的响应以查看正在接收的内容。

标签: c# jquery ajax rest controller


【解决方案1】:

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

  • 在布局页面中创建一个隐藏字段来存储根 url - &lt;input type="hidden" id="hdnRoot" value="@Url.Content("~/")" /&gt;
  • 有一个常量 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) 
    

【讨论】:

  • 我不认为我想要“LandingPage/GetQuadrantData/”;这就是它正在解决的问题,并且不起作用; URL 需要以“/api///”形式结束,例如:“/api/ABUELOS/2016-08-01/2016-08-31”
  • @Shannon - 我的错,请注意 api 路由。您可以通过两种方式实现这一点 1. 不更改 api 属性路由并将 ajax url 更改为 root + LandingPage/GetQuadrantData/&lt;unitname&gt;/&lt;startdate&gt;/&lt;enddate&gt; 2. 将 api 路由更改为 [Route("GetQuadrantData")] 并保持 ajax 调用不做任何更改,因为 ajax 中的数据将被传递作为查询字符串,并将绑定到操作参数。不过我会选择第一种方法..
【解决方案2】:

好的,这个解决方案解决了你的问题,但意味着你的代码有一些变化:

在视图中,当您调用Url.Action 时,您正在尝试从 mvc 控制器生成 webapi 路由。你可以看到this question,我说如何做到这一点。

基本上这个想法是使用Url.RouteUrl 和一个额外的路由值httproute = true

现在,您需要更改代码中的某些部分才能使用它:

首先,您使用属性来定义您的 Web api 路由,因此这些路由将添加到您的 WebApiConfig 类中定义的路由之后,正如我在引用问题的答案中提到的那样,Url.RouteUrl 将返回与路由值匹配的第一条路由。所以,你需要在默认路由之前声明WebApiConfig中的路由:

/* attributes removed */
public class LandingPageController : ApiController
{
    public HttpResponseMessage GetQuadrantData(string unit, string begdate, string enddate)
    {
        ...

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

        /* Route added before the default one */
        config.Routes.MapHttpRoute(
            name: "QuadrantData",
            routeTemplate: "api/{unit}/{begdate}/{enddate}"
        );

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

如果您不这样做,将匹配默认路由,因为 {id} 是可选的,unitbegdateenddate 将作为查询参数传递。

一旦解决了这个问题,你就会遇到另一个问题,要能够使用Url.RouteUrl,你需要知道所有的路由值(单位、开始日期、结束日期),这些值只有在脚本函数执行时才可用。但是当为客户端生成 html 时,您的 .cshtml 中的所有剃须刀代码都会在服务器中处理。

如您所见,当执行 javascript 时,您并没有执行 '@Url.RouteUrl...''@Url.Action...',此时您只是在处理一个字符串,该字符串具有在处理 razor 表达式时返回的值。

您可以做的一件事是将“模板”值传递给Url.RouteUrl 调用,并在脚本执行时将其替换为实际值:

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!');
    }
});

replaces 之后,变量url 的值将类似于/api/ABUELOS/2016-08-07/2016-08-13


如果不想将路由移动到WebApiConfig,可以在RouteAttribute中设置名称:

[RoutePrefix("api")]
public class LandingPageController : ApiController
{
    [Route("{unit}/{begdate}/{enddate}", Name = "QuadrantData")]
    public HttpResponseMessage GetQuadrantData(string unit, string begdate, string enddate)
    {
        ...

并在Url.RouteUrl调用中指定路由名称:

var url = '@Url.RouteUrl("QuadrantData", new
      {
          unit = "(unit)",
          begdate = "(begdate)",
          enddate = "(enddate)",
          httproute = true
      })'

这种方式对您的代码的干扰较小,但您需要知道要使用的路由的名称。

希望这会有所帮助。

【讨论】:

  • 你的意思是“Url.RouteUrl”在ajax调用中代替了“Url.Action”吗?
  • @B.ClayShannon:是的,完全正确
  • 我在控制器中使用“HttpResponseMessage”而不是“IHttpActionResult”作为 GetQuadrantData() 方法的返回值;有问题吗?
  • @B.ClayShannon,不,这不是问题,当我处理它时,我将其更改为返回另一个值。我只是忘记在答案中将其改回。请稍等。
  • NKosi 的回答有效;这是最简单的。不过,感谢您的帮助;如果我花更多时间在上面,我相信你的方法也会奏效。
【解决方案3】:

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

您的 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"  })

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

这会将httpRoute 添加到路由值中。

参考:Construct url in view for Web Api with attribute routing

现在用你的方法,我建议以下替代方法。

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

【讨论】:

    【解决方案4】:

    关于你的观点:

    如果我在浏览器中手动输入该 URL,那么 URL 栏会显示 “http://localhost:52194/api/ABUELOS/2016-08-21/2016-08-27”它有效 - 方法到达并且它“做它的事”。

    如下所示修改您的 Ajax 调用应该可以解决您的问题,并将向映射的 url 发送一个 GET 请求(显示按钮单击事件处理程序):

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

    【讨论】:

    • 我仍然用你的代码把它带到了房子的“失败”部分。
    • @B.ClayShannon 我已经用你提到的问题测试了这段代码,它适用于你的映射路线。您能否提及您找到的失败部分是什么?
    • NKosi 的回答有效;这是最简单的。不过,感谢您的帮助;如果我花更多时间在上面,我相信你的方法也会奏效。
    【解决方案5】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 2019-07-03
    • 1970-01-01
    相关资源
    最近更新 更多