当前位置: 首页 > 知识库问答 >
问题:

如何将复杂对象从jQuery ajax调用传递给ASP.NET web API GET?

阳博赡
2023-03-14

我在JavaScript中有以下包含过滤器选项的复杂对象

var filter={caseIdentifiter:'GFT1',userID:'2'};

我想传递给 ASP.NET MVC4 WebApi 控制器 GET

[HttpGet]
public IEnumerable<JHS.Repository.ViewModels.CaseList> Get([FromBody]Repository.InputModels.CaseListFilter filter)
{
  try
  {
    return Case.List(filter);
  }
  catch (Exception exc)
  {
    //Handle exception here...
    return null;
  }
}

使用jQuery ajax调用

var request = $.ajax({
  url: http://mydomain.com/case,
  type: 'GET',
  data: JSON.stringify(filter),
  contentType: 'application/json; charset=utf-8',
  cache: false,
  dataType: 'json'
});

ASP。NET控制器方法为“null”。如果我将其更改为POST,则过滤器对象将正确传递。有没有方法将复杂对象传递给GET?

我不想分离出URL的参数,因为会有很多参数,这会使它效率低下,很难有可选的参数,这样即使添加了新参数,方法签名也保持不变。

共有2个答案

龙俊良
2023-03-14

如果您将json数据附加到查询字符串,然后在web api端解析它。您可以解析复杂对象。这比post json对象样式有用。这是我的解决方案。

//javascript file 
var data = { UserID: "10", UserName: "Long", AppInstanceID: "100", ProcessGUID: "BF1CC2EB-D9BD-45FD-BF87-939DD8FF9071" };
var request = JSON.stringify(data);
request = encodeURIComponent(request);

doAjaxGet("/ProductWebApi/api/Workflow/StartProcess?data=", request, function (result) {
    window.console.log(result);
});

//webapi file:
[HttpGet]
public ResponseResult StartProcess()
{
    dynamic queryJson = ParseHttpGetJson(Request.RequestUri.Query);
        int appInstanceID = int.Parse(queryJson.AppInstanceID.Value);
    Guid processGUID = Guid.Parse(queryJson.ProcessGUID.Value);
    int userID = int.Parse(queryJson.UserID.Value);
    string userName = queryJson.UserName.Value;
}

//utility function:
public static dynamic ParseHttpGetJson(string query)
{
    if (!string.IsNullOrEmpty(query))
    {
        try
        {
            var json = query.Substring(7, query.Length - 7); //seperate ?data= characters
            json = System.Web.HttpUtility.UrlDecode(json);
            dynamic queryJson = JsonConvert.DeserializeObject<dynamic>(json);

            return queryJson;
        }
        catch (System.Exception e)
        {
            throw new ApplicationException("can't deserialize object as wrong string content!", e);
        }
    }
    else
    {
        return null;
    }
}
岳飞航
2023-03-14

找到这个StackOverflow问题/答案后

复杂类型在ApiControl ler参数中为null

控制器方法上的[FromBody]属性需要为[FromUri],因为GET没有正文。更改后,“过滤器”复杂对象将正确传递。

 类似资料:
  • 我正在开发将复杂数据从window.open()传递到MVC Controller action方法参数的javascript功能。我能够通过构建查询字符串并从控制器中的[FromQuery]检索它们来实现它。 但我的问题是,我想将数据作为模型对象传递。在窗户里可以吗。打开() 下面是我的javascript代码 如您所见,我可以在URL中传递数据,但它似乎是公开的。那么,有没有办法传入var u

  • 问题内容: 我在JavaScript中有以下复杂对象,其中包含过滤器选项 我想传递给ASP.NET MVC4 WebApi控制器GET 使用jQuery ajax调用 ASP.NET控制器方法中的“过滤器”对象为“空”。如果我将其更改为POST,则过滤器对象将正确传递。有没有办法将复杂的对象传递给GET? 我不想将参数分离到URL,因为会有许多参数使效率低下,很难拥有可选参数,并且即使添加了新参数

  • 问题内容: 我已经成功地建立了一个快速测试,以创建一个“类似REST的”服务,该服务返回序列化为JSON的对象,并且这非常容易且快速(基于本文)。 但是,虽然返回桃子一样的JSON格式的对象很容易,但我还没有看到任何处理非原语输入参数的示例。如何传递复杂的对象作为参数?我正在使用Apache CXF,但也欢迎使用其他框架(例如杰克逊)的示例:) 客户端可能类似于构建javascript对象,将其传

  • 我在示例中看到如何将消息字符串传递给亚马逊 sns sdk 的发布方法。但是,是否有如何将自定义对象作为消息传递的示例?我尝试将“消息结构”设置为“json”,但随后我得到错误。我应该将对象值传递到参数中的哪个位置? 有什么例子吗?

  • 问题内容: 我想将一个对象传递给控制器​​,并在控制器中检索值。我定义如下: HTML代码: Javascript: 但是我无法在控制器中检索值。它越来越空。 问题答案: 尝试以下操作:-您正在传递对象数组,因此您应该执行HTTPPost而不是HttpGet(这将适用于通过查询字符串发送它的原始类型数组,例如int,strgin等列表)(请记住查询字符串的限制)。尝试使用HTTPPost

  • 根据本指南,我能够将简单数据类型(如)的关联数组传递给PL/SQL过程。 可以这么说: 但是,我想调用下面的过程,取而代之的是复杂类型。 我尝试过各种方法,比如: 以下是失败的: 看起来您可以在包之外创建一个类型并引用它。 引用它: 但是,您不允许在包之外创建关联数组的RECORD。我可以用对象替换RECORD,但是我想不出任何东西可以替换关联数组,这是cx_Oracle可以传入或传出的唯一集合类