【问题标题】:MVC Controller Property Doesn't Recognize Parameter's CollectionMVC 控制器属性无法识别参数的集合
【发布时间】:2013-03-02 20:19:11
【问题描述】:

我正在调用一个 MVC 控制器方法并将其传递给一个 Entity 对象。在其他属性中,Entity 还具有 Contacts 属性。使用这种方法,控制器可以获取实体,以及实体中正确数量的联系人,但所有联系人的属性均为空。

这是原来的做法:

$.post('/Home/Save', $.param(entity), SaveComplete);

使用强类型控制器:

public ActionResult Save(Entity entity)

这会导致每个Entity.Contact 具有空属性:

并且 Fiddler 显示联系人被传递到服务器。

要让控制器识别实体的联系人属性,我必须这样做:

JavaScript:

$.post('/Home/Save', { entityAsJson: JSON.stringify(entity) }, SaveComplete);

控制器方法:

public ActionResult Save(string entityAsJson)
{
    try
    {        
        Entity entity = JsonConvert.DeserializeObject<Entity>(entityAsJson);
        // more code here
    }
}

这很不幸,因为现在我的控制器采用字符串而不是强类型实体。有没有办法让第一个选项起作用,还是我需要对 JSON 进行字符串化?

【问题讨论】:

  • 检查here。最受好评的答案...
  • @AliRızaAdıyahşi 在该答案中,您建议三个选项中的哪一个?原始问题未显示对象内的集合;只有主对象的原始属性。
  • 您不需要JsonConvert.DeserializeObject。尝试简单地在客户端上进行 json 序列化,并让服务器保持原样(IE:接受“实体”对象)。 Asp.NET MVC 有它自己的 jsonvalueprovider。如果这不能解决问题,我记得有时读到,你必须跳过一些障碍才能让 MVC(我认为是 3)与从客户端传递的数组配合得很好。
  • 我用data: $('#form').serialize(),发模型
  • 啊哈:找到了:haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx。这有点过时了,但我猜如果你符合指定的格式它应该可以工作:)

标签: javascript jquery asp.net-mvc-4


【解决方案1】:

为了在控制器操作中使用强类型参数并使用正确绑定的 ajax 发送数据(包括集合属性),您需要执行以下操作:

  • 使用$.ajax 而不是$.post,因为$.post 不允许配置contentType 选项
  • 您需要发送 JSON。所以你需要JSON.stringfy你的数据
  • contentType 设置为 "application/json",因为这会告诉 ASP.NET MVC 为 JSON 使用正确的模型绑定器

所以下面的代码应该适用于你原来的控制器动作:

$.ajax({ 
    url: '/Home/Save', 
    type: 'POST', 
    data: JSON.stringify(entity), 
    contentType: "application/json",
    success: SaveComplete 
});

【讨论】:

  • @DaveA 是的,我知道......我已经多次回答过这类问题,但到目前为止,我无法找到一个好的规范问题/答案对(甚至在我已回答)。因此,如果您知道一个好的,我很乐意将其作为副本关闭。
  • @nemesv Dave 在这里谈论他的答案:stackoverflow.com/a/15170512/279516。那时我不知道,但他的回答会解决我原来的问题(那个帖子 - 参数的值为空)和我的新问题(这个帖子 - 集合的参数 within 一个参数是空的) ,虽然我不知道为什么。您的回答对此有很好的解释。
  • 我想说你的实现比我的好。我的 jquery 还在增长。例如,我喜欢你如何将委托传递给成功方法并隐式传递数据,而我显式传递它,因此不那么优雅@nemesv
【解决方案2】:

在你的情况下,我不知道你为什么要发布 javascript 帖子。如果它是强类型绑定,那么只需执行以下操作:

(1) 包装您的控件,在 using 块 (Form) 下提交按钮。
(2) 调用你的动作,它应该有你的类名作为参数。

例如:

公共操作结果(YourClassName 模型) { 您的示例代码 }

在模型中,您将获得您在视图中填充的任何内容...

【讨论】:

  • 这是否适用于具有使用数据表显示的集合属性的对象?
猜你喜欢
  • 2013-04-22
  • 2020-11-11
  • 2019-06-27
  • 2018-11-11
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
相关资源
最近更新 更多