加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 将JSON发布到Controller

发布时间:2020-12-16 03:32:59 所属栏目:asp.Net 来源:网络整理
导读:我在我的控制器中有这个: [HttpPost] public void UpdateLanguagePreference(string languageTag) { if (string.IsNullOrEmpty(languageTag)) { throw new ArgumentNullException("languageTag"); } ... } 并将此jQuery代码POST到控制器: jQuery.ajax({ ty
我在我的控制器中有这个:

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

        ...
    }

并将此jQuery代码POST到控制器:

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 POST到MVC控制器?我可以使用Fiddler检查POST,看看请求是否正确.出于某种原因,UpdateLanguagePreference()获取null或空字符串.

解决方法

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

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

?{
    Test: 'Hi'
}

接收类是:

public class MyModel
{
    public string Test { get; set; }
}

使用接收控制器方法,如:

[HttpPost]
public JsonResult Submit(MyModel model)
{
    . . .

它会工作.但是,如果您的Controller方法具有非常小的,看似无害的变化:

[HttpPost]
public JsonResult Submit(MyModel test)
{
    . . .

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

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

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

由于此Action参数的任何合理名称都是一个可能合理的属性名称(模型,数据等),并且由于它不区分大小写,因此在不编写自己的模型绑定器的情况下防止它的最安全方法是标准化一个,疯狂,非常 – 不太可能成为属性名称的参数名称,如:

[HttpPost]
public JsonResult Submit(MyModel _$_$twinkleTwinkleLittleFuckIt)
{

但是,如果你有时间,修复ModelBinder / JsonValueProviderFactory,这样就有0风险,而不是十年内那个奇怪的bug,没有人能够达到最低点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读