我的 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/