在 MVC 3 应用程序中为模型中的对象属性创建视图?

2023-12-05

我有一个 Asp.Net MVC 3 应用程序,其中包含一个由 EF 访问的数据库“Consultants”。现在,数据库中的顾问表与其他几个表存在一对多关系,以获取简历类型信息(工作经验等)。因此,用户应该能够填写一次他们的姓名等,但应该能够添加一些“工作经历”,等等。

但这些外键表是模型中的复杂对象,在创建“创建视图”时,我只获得简单的属性作为编辑器字段。我该如何设计一个或多个视图以便也可以填充复杂的对象?我在脑海中描绘了一个视图,其中简单的属性是简单的字段,然后是某种控件,您可以在其中单击“添加工作经验”,并且将添加所需数量的控件。但我该如何做到这一点并仍然使用模型绑定呢?事实上,我根本不知道该怎么做。 (顺便说一句,程序和语言代表一般的软件体验和自然语言能力,而不是编程语言,以防您想知道其中的关系)。

任何想法都非常感谢!

这是默认情况下通过 add View 命令创建的 Create View:

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

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

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

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

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

        <div class="editor-label">
            @Html.LabelFor(model => model.Description)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Description)
            @Html.ValidationMessageFor(model => model.Description)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

这是 EF 数据库图:

Consultants EF diagram

Update:

根据建议,我尝试了Steven Sanderson的博客解决方案,但无法使其正常工作。我在主视图中添加了这个:

    <div id="editorRows">
        @foreach (var item in Model.Programs)
        {
            Html.RenderPartial("ProgramEditorRow", item);
        }
    </div>
<input type="button" value="Add program" id="addItem" />

我还添加了 JavaScript:

<script type="text/javascript">
    var url = '@Url.Action("BlankEditorRow", "Consultant")';
    $(document).ready(function () {
        $("#addItem").click(function () {
            $.ajax({

                url: url,
                cache: false,
                success: function (html) {
                    alert(html);
                 $("#editorRows").append(html); }
            });
            return false;
        });
    });
</script>

局部视图:

@model Consultants.Models.Program
@using Consultants.Helpers

<div class="editorRow">
@*@using (Html.BeginCollectionItem("programs"))
{*@
    @Html.TextBoxFor(model => model.Name)    
@*}*@
</div>

以及控制器中的操作方法:

    public ActionResult Create()
    {
        Consultant consultant = new Consultant();

        return View(consultant);
    }


    public ActionResult BlankEditorRow()
    {
        return PartialView("ProgramEditorRow", new Program());
    }

请注意,我在部分视图中注释掉了 Html.BeginCollectionItem 部分,因为我无法让它工作。它只给我史蒂文·桑德森谈到的隐藏字段,而不是实际的文本框。所以我尝试注释掉该部分,然后只有一个文本框。好吧,这让我得到了文本框,但我无法在 post 方法中获取该信息。我使用 Consultant 对象作为返回参数,但 Programs 属性不包含 Program。也许这与我无法让 BeginCollectionItem 帮助器工作有关,但无论如何我不明白如何做到这一点,或者如何访问据称添加到视图中的程序。对于一个简单的对象,我将通过 _repository.AddToConsultants(consultant) 之类的方法在 post 方法中添加新对象,当我保存到 EF 时,它会获取其 id。但是我如何对程序对象执行同样的操作并通过 EF 将其保存到数据库中?


Phil Haack 写了一篇很棒的博客文章,解释了如何对列表进行绑定建模。它是 MVC2 特有的,但我不确定版本 3 是否对此进行了改进。

模型绑定到列表.

在允许用户添加任意​​数量的项目的情况下,您可能希望使用 JavaScript 创建新的输入字段。史蒂文·桑德森(Steven Sanderson)在此展示了如何实现这一目标:

编辑可变长度列表,ASP.NET MVC 2 样式.

这些资源应该可以帮助您一路实现目标。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 MVC 3 应用程序中为模型中的对象属性创建视图? 的相关文章

随机推荐