javascript - 通过 javascript 将复杂参数传递给 Web API 服务

标签 javascript c# jquery asp.net asp.net-web-api

我正在制作一个 ASP.NET Web API 网络服务和一个 HTML/javascript 页面来测试它。我遇到的问题是传递复杂的数据参数并让它在 Web API Controller 中正确通过。

我知道有很多类似的问题,我已经阅读了它们并尝试了解决方案,但还没有解决。我还阅读了一些 JQuery 文档。

这是我的 Controller :

public class TitleEstimateController : ApiController
{
    public IHttpActionResult GetTitleEstimate([FromUri] EstimateQuery query)
    {
            // All the values in "query" are null or zero
            // Do some stuff with query if there were anything to do
    }
}

public class EstimateQuery
{
    // Various fields
}

WebApiConfig.cs中的路由映射:

config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{query}"
            );

和 javascript:

var uri = 'api/titleEstimate/';
var query = {
            "username": $("#user").val(),
            // other fields
        };

      $.getJSON(uri,query)
          .done(function (data) {
              $('#product').text("OK");
          })
          .fail(function (jqXHR, textStatus, err) {
            $('#product').text('Error: ' + err);
          });

目前我遇到了 404。我尝试了 $.getJSON(uri + '/' + query) 但这也不起作用。在我传递这个对象之前,我成功地调用了它,所以我认为路由通常没问题。我尝试了类型转换器,但没有用,仍然是 404。有人看到我遗漏了什么/做错了什么吗?

最佳答案

回答

您使用了错误的 uri。您需要 api/titleEstimate/getTitleEstimate。这解释了并将解决您的 404。

后续问题的答案

您正在做的所有其他事情几乎 都能正常工作。解决 404 后,您会发现您没有收到值 FromUri,您将有一个跟进问题。因此,您需要将路由配置更改为:

config.Routes.MapHttpRoute(
    name: "Default",
    routeTemplate: "api/{controller}/{action}"
);

然后您不仅会解析您的 404,还会收到您作为查询字符串参数发送的 FromUri 值。

演示

这里是 a fiddle for evidence ,正在调用 this controller ,这is hosted LIVE here .我在工作版本中唯一更改的是用于解析 404 的 uri 和用于确保您收到 FromUri 值的路由配置。就这样。

HTML

<label>Username:
    <input id="user" />
</label>
<button id="submit">Submit</button>
<button id="submit-fail">Submit Fail</button>
<div id="product"></div>

JavaScript

这会成功。

请注意,我们只需要,因为我们在这里进行跨站点脚本是为了演示目的。

var domain = "https://cors-webapi.azurewebsites.net";

$("#submit").click(function () {

    var uri = domain + '/api/titleEstimate/getTitleEstimate';

    var query = {
        "username": $("#user").val(),
        // other fields
    };

    $.getJSON(uri, query)
        .done(function (data) {
        $('#product').text(data);
    })
        .fail(function (jqXHR, textStatus, err) {
        $('#product').text('Error: ' + err);
    });
});

这将是 404。

$("#submit-fail").click(function () {

    var uri = domain + '/api/titleEstimate';

    var query = {
        "username": $("#user").val(),
        // other fields
    };

    $.getJSON(uri, query)
        .done(function (data) {
        $('#product').text(data);
    })
        .fail(function (jqXHR, textStatus, err) {
        $('#product').text('Error: ' + err);
    });
});

Controller

public class TitleEstimateController : ApiController
{
    public class EstimateQuery
    {
        public string username { get; set; }
    }

    public IHttpActionResult GetTitleEstimate([FromUri] EstimateQuery query)
    {
        // All the values in "query" are null or zero
        // Do some stuff with query if there were anything to do
        if(query != null && query.username != null)
        {
            return Ok(query.username);
        }
        else
        {
            return Ok("Add a username!");
        }
    }        
}

您可以阅读更多详细信息about WebApi routing here .通过阅读它,您可能会在路由配置中想出一个替代解决方案。还有很多terrific examples in this blog post .

关于javascript - 通过 javascript 将复杂参数传递给 Web API 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29977668/

相关文章:

当其他 div 可见时,jQuery 通过 id 隐藏 div?

javascript - 为什么我的 Angular 代码不起作用?

javascript - 为什么在 JS 中 +str 比 str*1 更好地将字符串转换为数字?

javascript - Rails AJAX 调用以清除表单输入数据

c# - 将 XmlTextWriter 与 MemoryStreams 一起使用时出现问题

JQuery Datepicker,无法手动触发onSelect事件!

javascript - 如何使用样式加载器使用组件级 CSS 为元素设置样式?

c# - InAirSignature.exe 中发生类型为 'System.IO.FileNotFoundException' 的未处理异常

c# - 有人有阅读 ISOBUS (ISO 11783-10) 二进制时间日志文件的经验吗?

javascript - jeditable 和 autocomplete 协同工作的工作示例