mvc4表单提交反序列化不在子项上工作(或根本不工作)

时间:2012-12-10 22:45:58

标签: c# jquery ajax asp.net-mvc-4 deserialization

查看:

@model My.Data.Section

@using (Html.BeginForm("Save", "Sections"))
{
    @Html.Partial("_Fields", Model.Fields);

    <input type="submit" value="Save">
}

查看JS:

@Scripts.Render("~/bundles/jqueryval")
<script type="text/javascript">
    $(function () {
        $('form').submit(function () {
            if ($(this).valid()) {
                $.ajax({
                    url: this.action,
                    type: this.method,
                    data: $(this).serialize(),
                    success: function (result) {
                        // do some stuff with the returned partial
                    }
                });
            }
            return false;
        });
    });
</script>

型号:

来自我的数据层(EF5 / DBContext / unitofwork)

namespace My.Data
{
    using System;
    using System.Collections.Generic;

    public partial class Section
    {
        public Section()
        {
            this.Fields = new HashSet<Field>();
        }

        public int SectionID { get; set; }
        public int FormID { get; set; }
        public string Name { get; set; }
        public Nullable<int> PrevSection { get; set; }
        public Nullable<int> NextSection { get; set; }
        public int SortOrder { get; set; }

        public virtual ICollection<Field> Fields { get; set; }
        public virtual Form Form { get; set; }
    }
}

控制器:

[HttpPost]
public ActionResult Save(Section model, FormCollection fc)
{
    // do some fun stuff
    return PartialView("_Section", model);
}

当我调试控制器时,模型对象没有反序列化,我认为这是因为我没有使用labelfor&amp; textboxfor等?

当我检查FormCollection对象时,它具有我需要的所有键和所有值,但是,我想从我的字段中获取一些其他值,例如data-fieldid-itemid =“1”,如何我做到了吗?最好的方法是什么?

是否需要使用LabelFor / TextboxFor?

我想我所期待的是填充数据的模型对象,以及我的模型对象的子项,特别是公共虚拟ICollection Fields {get;组;也要填写。

我有一种感觉,我在这里缺少一些概念,任何想法?

谢谢!

1 个答案:

答案 0 :(得分:1)

首先,您不应该对表单使用部分视图。相反,您应该使用EditorTemplates。

其次,您无法获取属性,因为浏览器不会将这些属性发布到服务器。 MVC坚持使用浏览器支持的机制。

你的选择是,使用提交处理程序用您的属性填充隐藏字段,将数据放在隐藏字段中开始,做一个ajax帖子,在其中设置您要发布的所有数据,或者只是让你的控制器&#34;记得&#34;它在GET中设置的属性。