【问题标题】:ApiController method with multiple parameters带多个参数的 ApiController 方法
【发布时间】:2016-08-03 17:37:41
【问题描述】:

这里不清楚http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 如何在 ApiController 方法中使用多个参数以及调用它的 URL 是什么。有什么线索吗?

C#

[RoutePrefix("api/workorders")]
    public class WorkOrdersController : ApiController
    {
            [Route("WorkOrdersByDates")]
            [HttpGet]
            public IEnumerable<WorkOrderItemView> GetWorkOrdersByDates(string startDate, string endDate)
            {
                var r = new List<WorkOrderItemView>();
                //
                return r;
            }
    }

AJAX

 var startDate = $('#StartDate').val();
            var endDate = $('#EndDate').val();

            $.ajax(
                {
                    url: "api/workorders/WorkOrdersByDates",
                    type: "GET",
                    contentType: "application/json",
                    data: JSON.stringify({ startDate: "' + endDate + '", endDate: "' + endDate + '" }),
                    success: function (result) {
                        alert(result.Result);
                    }
                });

Global.asax

  protected void Application_Start()
        {


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


            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

【问题讨论】:

  • 你不应该对这些参数使用JSON.stringify,只需给它原始对象。

标签: c# ajax http-get asp.net-apicontroller


【解决方案1】:

您不应该对这些参数使用JSON.stringify,因为这会将字符串传递给data 参数,只需将原始对象本身提供给它,然后让jQuery 将它们转换为查询字符串。

var startDate = $('#StartDate').val();
var endDate = $('#EndDate').val();

$.ajax(
    {
        url: "api/workorders/WorkOrdersByDates",
        type: "GET",
        contentType: "application/json",
        data: { startDate: "' + endDate + '", endDate: "' + endDate + '" },
        success: function (result) {
            alert(result.Result);
        }
    });

【讨论】:

    【解决方案2】:

    不要对 ajax 调用者中的数据进行字符串化。这应该有效:

     var startDate = $('#StartDate').val();
            var endDate = $('#EndDate').val();
    
            $.ajax(
                {
                    url: "api/workorders/WorkOrdersByDates",
                    type: "GET",
                    contentType: "application/json",
                    data: { 
                        startDate: startDate.toISOString(), 
                        endDate: endDate.toISOString()
                    },
                    success: function (result) {
                        alert(result.Result);
                    }
                });
    

    (另请注意,当控制器期望 DateTime 类型时,我在 JavaScript 日期值上使用 toISOString() - 只要 JavaScript 对象实际上是日期值,这就会提供一致的转换 - 或者您可以将控制器类型保留为string 并放弃 toISOString(),但我发现 ISO 转换很有帮助)

    【讨论】:

      【解决方案3】:

      您传递参数的 Ajax 方法抛出“data”参数,但是您的 api 使用的是“HttpGet”。 要正确使用“Get”进行 ajax 调用,您需要在 URL 中传递参数。

      $.ajax(
          {
              url: "api/workorders/WorkOrdersByDates?startDate=" + startDate + "&endDate=" + endDate,
              type: "GET"...
      

      【讨论】:

      • 虽然这是一种方法,但它不是必需的。获取和数据参数工作得很好。
      • jQuery 会将data 转换为 GET 查询字符串
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      相关资源
      最近更新 更多