ASP MVC如何为具有子元素的模型创建编辑器?

时间:2011-03-25 18:33:24

标签: html asp.net-mvc mapping viewmodel children

我是asp的新手。 我必须在mvc中编写一个应用程序,它有一个数据库,我有两个表。 一个表Parent与表Children一对一地被实现。

Parent
-------------
parent_id
name


Children
-------------
children_id
parent_id (foreign key)
name

当用户想要为Parent表创建元素时,编辑器必须有机会添加(创建)Children。

当用户编辑Parent时,他应该有机会删除/编辑子项。

无法在separete编辑器中添加/编辑/删除子项

我想我sholuld使用javascript为Child生成进一步的控件。我可以这样做,但我不知道如何将这个html控件映射到模型?

我写了这个观点:

<script language="javascript" type="text/javascript">
    function add_child() {
        $('#children').append($('<input name="child[' + ++$('#children>input').get().length + ']" />'));
    }
</script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Create Parent</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>


        <div>Children:</div>
        <div id="children">
            @Html.TextBox("child[1]")
        </div>
        <div>
            <input onclick="add_child()" type="button" />
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

这很好用。但我真的不知道如何在我的父模型上映射这个元素。

现在我的创建视图模型如下所示:

public class ParentModel {
    public ParentModel() {
        Children = //... get all children from database
    }

    public string Name { get; set; }
    // this should be an ids of selected children
    public string[] SelectedChildren { get; set; }
    // children to display
    public ICollection<ChildModel> Children { get; set; }

}

public class ChildModel {
    public string Name { get; set; }
}

如何通过视图中的值填充此子项?

控制器:

public class ParentController : Controller
{
        // show form
        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Index() {
            ParentModel model = new ParentModel();
            return View(model);
        }

        // Get Parent and Children
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Index(ParentModel form) {
            // I want to read a form.CreatedChildren
            // but it is Null
            return View();
        }

}

我想阅读一个form.CreatedChildren,但它是空的......

2 个答案:

答案 0 :(得分:5)

您可以结帐following blog post。关于验证的followup

答案 1 :(得分:0)

如果我正确理解您的模型,您需要

// children to display
public ICollection<ChildModel> Children { get; set; }
在您的父模型中

。在ParentModel构造函数中

Children = new HashSet<ChildModel>();

至于使用数据填充模型,它属于您的控制器。类似的东西:

var parents = from p in context.ParentModels
              select p;
Return View(parents);