0

我正在调用一个 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 进行字符串化?

4

2 回答 2

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 
});
于 2013-03-02T20:31:17.677 回答
0

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

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

例如:

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

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

于 2013-03-02T20:39:25.463 回答