通过GET请求将JSON参数传递给MVC控制器

3

我试图将一些JSON传递到GET请求的MVC控制器的查询字符串中,但似乎只能作为null传递。

Ajax(通过TypeScript)

$.ajax(url, {
  method: 'GET',
  data: { 'request': JSON.stringify(this.request) },
  dataType: 'json'
})

MVC Controller

[Route("stuffAndThings/{request?}")]
public async Task<HttpResponseMessage> GetStuff(requestType request)
{
}

因为这是TypeScript,所以传递的对象是C#模型的TypeScript表示,包括几个自定义对象。
TS类
class requestType {
  pageData: PageData;
}

C#类

public class requestType
{
  public PageData pageData { get; set; } = new PageData();
}

在开发工具中查看请求,似乎已正确地传递到查询字符串上,但是始终作为 null 通过控制器。

我错过了什么?

编辑

针对一些评论,控制器方法纯粹用于数据检索,并且未来有可能将其转换为 WebAPI 方法,因此如果可能的话,我想保留它作为 GET 请求。


可能你需要直接传递PageData,而不需要将其包装在requestType中。 - Harutyun Imirzyan
3
JSON.stringify() 的意思是你正在传递一个字符串。你的参数需要是 string request(然后对其进行反序列化)。 - user3559349
尝试使用UrlEncode进行编码。可能会发现PageData包含了一些在查询字符串中无效的字符。然而,考虑到您这样做的原因是由于URI的长度,使用JSON将是自我打败的(引入比所需更多的字符)。我建议您将参数发送到POST请求的正文中。 - user1672994
@ADyson 这是我的糟糕的代码混淆,我很快会更改它,但控制器方法纯粹用于数据检索,所以如果可能的话,我想坚持使用GET。POST是我的首选,但同事劝我不要这样做,指出将来可能会将其更改为WebAPI方法。 - Dark Hippo
1
@DarkHippo 如果对象复杂和/或大小不可预测,我认为这是明智的。通常情况下,如果有很多参数要提交,像复杂搜索这样的东西会使用POST,仅仅因为请求的复杂性,即使它们在语义上似乎真的应该是GET。 - ADyson
显示剩余5条评论
2个回答

0
在MVC控制器中,您将以字符串形式获取参数,因为您已通过GET请求将参数作为字符串传递。
[Route("stuffAndThings/{request?}")]
public async Task<HttpResponseMessage> GetStuff(string request)
{

}

requestType类可序列化, 现在在你的方法中,你需要将JSON字符串反序列化为你的对象。
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(request)))  
{   
   DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(requestType));  
   requestType requestObj = (requestType)deserializer.ReadObject(ms);   
    //your code here   
}

-3

Json.Stringfy将您的请求转换为字符串形式,在控制器中,您正在使用特定类型进行提取。因此,为了获得正确的结果,请使用字符串而不是RequestType进行更新。

如果仍然遇到问题,请联系我。 我在这里

如果有帮助,请回复或点赞。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接