通过Ajax向MVC发布复杂对象

时间:2013-03-10 15:35:28

标签: c# javascript asp.net-mvc-3 jquery

我一直在摆弄MVC很长一段时间了,我有兴趣创建一个迷你应用程序,在一张CD下记录所有的cd内容。我现在的主要障碍是如何将内容列表与其他属性值一起传递给Cd.class?

public class Cd
{
    public int CdId { get; set; }
    public string Description { get; set; }
    public virtual ICollection<Content> Contents { get; set; } 
}

public class Content
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string ContentType { get; set; }
}

查看:

 $.ajax({
 url: '/cd/addCd',
 type: 'POST',
 data:$('form').serialize()
    });

@using(Html.BeginForm()){
@Html.LabelFor(x=>x.CdId)
@Html.TextBoxFor(x=>x.CdId) <br/>
@Html.LabelFor(x=>x.Description)
@Html.TextBoxFor(x=>x.Description)<br />
<input type="submit" value="Submit" id="submit"/>

}

请注意,CdId和Description值已经被ajax的Serialize函数传递 - 只有Contents属性是我在掌握这个想法时遇到的问题

更新

我通过创建一个将序列化数据发送到控制器的ajax片段解决了我的查询:

 $.ajax({
            type: 'POST',
            url: 'http://localhost:54004/Cd/AddCd',
            data: JSON.stringify(formData),
            contentType:'application/json;charset=utf-8'
        })
        .success(function () { })

使用以下formData obj:

   var formData = {
        'Description': "Learning Visual Studio 2012",
        'CdId': 1,
        'Contents': [{ "Id": 1, "Name": "Video #1", "ContentType": "Mp4" }, { "Id": 2, "Name": "Video #2", "ContentType": "Mp4" }]
    };

现在控制器正在接收完整的Cd实体值及其内容。 希望这对未来的某些人有用。

2 个答案:

答案 0 :(得分:1)

实现您想要的最佳方法是删除JQuery并用Ajax.BeginForm替换您的HTML.BeginForm

@using(Ajax.BeginForm()){
@Html.LabelFor(x=>x.CdId)
@Html.TextBoxFor(x=>x.CdId) <br/>
@Html.LabelFor(x=>x.Description)
@Html.TextBoxFor(x=>x.Description)<br />

@Html.TextBoxFor(x=>x.Contents[0].Id)<br />
@Html.TextBoxFor(x=>x.Contents[0].Name)<br />
@Html.TextBoxFor(x=>x.Contents[0].ContentType)<br />
@Html.TextBoxFor(x=>x.Contents[1].Id)<br />
@Html.TextBoxFor(x=>x.Contents[1].Name)<br />
@Html.TextBoxFor(x=>x.Contents[1].ContentType)<br />
<input type="submit" value="Submit" id="submit"/>
}

现在,您的“提交”按钮将发布到“查看并发送整个模型”后命名的方法

答案 1 :(得分:0)

不是通过迭代手动构建JSON对象,而是以knockoutmvc的形式存在一个有趣的替代方案(Knockout与MVC集成)

检查示例 - http://knockoutmvc.com/BetterList

它发送完整的JSON对象而不编写任何额外的代码。