首页 > 解决方案 > 如何在 ASP API 中将参数从 JS 传递给 Controller

问题描述

我正在针对流量数据的数据库模型运行 LINQ 查询。
html页面有一个下拉菜单,我会从中得到一个 selectedInjury 值来修改查询结果(这里是模拟的)。我不知道如何将值传递给控制器​​。

我尝试过的每个变体都有

Failed to load resource: the server responded with a status of 500 (Internal Server Error)

这是我正在尝试使用的 Javascript:

var mockSelectedInjury = "FATAL";
$.getJSON("/api/query1/selectedInjury", mockSelectedInjury)
    .done(function (data) {
        $.each(data, function (key, crash) {
            $('<li>', { text: formatCrashReport(crash) }).appendTo($('#crashTable'));
        });
    });

这是我在控制器中编写的方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using final.Models;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace final.Controllers
{
public class CrashController : ApiController
{
    ChicagoTrafficEntities myEntities = new ChicagoTrafficEntities();

    [Route("api/query1")]
    [HttpGet]
    public IHttpActionResult GetQuery(string selectedInjury)
    {
        List<CrashReport> returnList = new List<CrashReport>();

        //get a selection of all the data where injury matches
        var records = from report in myEntities.CrashReports
                      where report.MostSevereInjury == selectedInjury
                      select new
                      {
                          PrimeContributingCause = report.PrimeContributingCause,
                      };

        // add the query items to a list
        foreach (var item in records)
        {
            CrashReport temp = new CrashReport
            {
                PrimeContributingCause = item.PrimeContributingCause
            };
            returnList.Add(temp);
        }

        // create a new query from that set that includes a count of the 
        // occurrences of the injury per the primeCause.
        var foo = returnList.GroupBy(n => n.PrimeContributingCause).
                Select(group =>
                    new
                    {
                        PrimeContributingCause = group.Key,
                        NumberInjuries = group.Count()
                    }).OrderByDescending(n => n.NumberInjuries);

        return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK, Json(foo)));
    }
}

}

标签: asp.net-web-apiparameters

解决方案


如果您的 Web API 需要一个类似于 的 URL api/query1/FATAL,那么您应该相应地在 JavaScript 中构造 URL:

var mockSelectedInjury = "FATAL";
$.getJSON("/api/query1/" + mockSelectedInjury)
   .done(function (data) {
      // ...
    });

替代方案:使用查询参数

如果要发送 Query-Parameters(而不是将参数作为路径的一部分),则构造一个对象并将其作为第二个参数传递:

var paramContainer = {'selectedInjury': 'FATAL'};
$.getJSON("/api/query1", paramContainer)
   .done(function (data) {
        // ...
    });

您的 API 方法的签名如下所示:

[Route("api/query1")]
[HttpGet]
public IHttpActionResult GetQuery(string selectedInjury)
{
}

推荐阅读