asp.net - 将 JSON 发布到 Controller

标签 asp.net asp.net-mvc json controller

我的 Controller 中有这个:

[HttpPost]
public void UpdateLanguagePreference(string languageTag) {
 if (string.IsNullOrEmpty(languageTag)) {
  throw new ArgumentNullException("languageTag");
 }
 ...
}

并将此 jQuery 代码发布到 Controller :
jQuery.ajax({
  type: 'POST',
  url: '/Config/UpdateLanguagePreference',
  contentType: 'application/json; charset=utf-8',
  data: '{ "languageTag": "' + selectedLanguage + '" }'
});

然而,当我尝试代码时,我得到了错误:
Server Error in '/' Application.
Value cannot be null.
Parameter name: languageTag

有什么问题?这不是如何将 JSON 发布到 MVC Controller 吗?我可以使用 Fiddler 检查 POST 并查看请求是否正确。出于某种原因,UpdateLanguagePreference()正在获取 null 或空字符串。

最佳答案

非常重要的警告,即使在 MVC3 中,关于 MVC3 的工作方式。

如果你传递一个像这样的对象:

​{
    Test: 'Hi'
}

接收类是:
public class MyModel
{
    public string Test { get; set; }
}

使用接收 Controller 方法,例如:
[HttpPost]
public JsonResult Submit(MyModel model)
{
    . . .

它会起作用的。但是如果你的 Controller 方法有这个很小的、看似无害的变化:
[HttpPost]
public JsonResult Submit(MyModel test)
{
    . . .

它会失败。这是因为如上所述,MVC 框架将 JSON 消费到 Dictionary 中,并看到其中一个参数具有相同的名称,不区分大小写,作为其键之一(“Test”/“test”)。然后它将字符串值“Hi”分配给Test,并将其传递给这个参数“test”,尽管这显然不是作者想要的。

最有问题的是,框架在尝试将字符串分配给 MyModel 类型的 arg 时不会抛出错误,这至少可以为您提供有关问题所在的线索。它没有看到这是错误的类型并回退到它的替代行为(如果这些 arg/properties 名称不匹配,它会追求)。它只是默默地失败并将 null 分配给你的论点,让你不知道发生了什么。

我反复遇到这个问题,最后发现了使事情似乎在 MVC 中随机停止工作的故障......我希望这对其他人有帮助。

由于此 Action 参数的任何合理名称都是潜在合理的属性名称(模型、数据等),并且由于它不区分大小写,因此在不编写自己的模型绑定(bind)器的情况下防止它的最安全方法是标准化一个疯狂的、非常-不太可能成为属性名称参数名称,例如:
[HttpPost]
public JsonResult Submit(MyModel _$_$twinkleTwinkleLittleFuckIt)
{

但是,如果您有时间,请修复 ModelBinder/JsonValueProviderFactory,这样风险就为零,而不是十年来一个没有人能深究的奇怪错误。

关于asp.net - 将 JSON 发布到 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2861276/

相关文章:

javascript - 在Chrome扩展程序中使用另一个网站的innerHTML创建变量

json - 如何使用 angular2 react 形式构建嵌套数组?

c# - 处理并发文件写入

asp.net - word-wrap 不是已知的 CSS 属性名称

c# - 通过 Id 获取用户 asp.net mvc

c# - Windows Azure 上的 ASP.NET MVC 4 session 10 分钟后过期

jquery - JQuery 中的变量作用域行为不当

c# - 我可以选择哪些标准的 ORM?

c# - 如何使 Fluent API 配置与 MVC 客户端验证一起使用?

asp.net-mvc - Asp.Net MVC HTTP错误401.0 –未经授权