MVC控制器属性无法识别参数的集合

时间:2013-03-02 20:19:11

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

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

这是最初的方法:

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

使用强类型控制器:

public ActionResult Save(Entity entity)

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

enter image description here

Fiddler表示联系人已传递到服务器。

要让控制器识别Entity的Contacts属性,我必须这样做:

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进行字符串化?

2 个答案:

答案 0 :(得分:4)

为了在控制器操作中使用强类型参数并使用正确绑定的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 
});

答案 1 :(得分:0)

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

(1)包裹您的控件,使用块(表格)下的提交按钮 (2)调用应将您的班级名称作为参数的行动。

e.g:


    Public Action Result (YourClassName model)
    {
          Your sample Code
    }

在模型中,你将得到你在视图中填写的任何内容......