2013-03-02 42 views
0

我正在调用MVC控制器方法并将其传递给一个Entity对象。在其他物业中,Entity也有Contacts财产。通过这种方法,控制器获取实体以及实体内的正确联系人数量,但所有联系人的属性均为空。MVC控制器属性无法识别参数的集合

这是原来的做法:

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

随着强类型的控制器:

public ActionResult Save(Entity entity) 

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

enter image description here

而且提琴手显示该联系人s传递给服务器。

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

的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串联起来?

+0

检查[这里](HTTP://计算器。com/questions/5980389 /正确使用ajax-post-in-jquery-to-pass-model-from-strong-typed-mvc3-vie)。最有回报的答案... – 2013-03-02 20:23:01

+0

@AliRızaAdıyahşi在这个答案中,您提出三个选项中的哪一个?原始问题不显示对象内的集合;只有主对象上的基本属性。 – 2013-03-02 20:29:22

+0

你不应该需要'JsonConvert.DeserializeObject'。尝试简单地在客户端上执行json序列化,然后保持原样(IE:接受“实体”对象)。 Asp.NET MVC有它自己的jsonvalueprovider。如果这样不能解决问题,我记得有时候会看到,为了让MVC(3我觉得)能够与来自客户端的数组进行良好的交流,你必须跳过一些环节。 – Alxandr 2013-03-02 20:29:38

回答

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 
}); 
+0

优秀的答案,它的工作完美。谢谢! – 2013-03-02 20:39:01

+0

嗯,奇怪的熟悉 – 2013-03-02 20:59:29

+1

@DaveA是的,我知道...我已经多次回答这种类型的问题,但到目前为止我无法找到一个很好的问题/答案对(甚至在我已经回答)。所以如果你知道一个好的我会很乐意把它作为一个副本来关闭它。 – nemesv 2013-03-02 21:20:07

0

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

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

e.g:

 

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

模型,你会得到什么u必须填写上你的看法......

+0

应该为具有集合的对象使用数据表显示的属性? – 2013-03-02 20:46:25