【问题标题】:Create Views for object properties in model in MVC 3 application?在 MVC 3 应用程序中为模型中的对象属性创建视图?
【发布时间】:2011-02-16 07:19:11
【问题描述】:

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

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

任何想法都非常感谢!

下面是 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 数据库图:

更新:

根据建议,我尝试了 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 部分,因为我无法让它工作。它只给了我 Steven Sanderson 谈到的隐藏字段,而不是实际的文本框。所以我试着评论那部分,只是有一个文本框。好吧,这让我得到了文本框,但我无法在 post 方法中获得该信息。我使用 Consultant 对象作为返回参数,但 Programs 属性不包含 Program。也许这与我无法让 BeginCollectionItem 帮助器工作的事实有关,但无论如何我不明白如何做到这一点,或者如何进入应该在视图中添加的程序。使用一个简单的对象,我会通过 _repository.AddToConsultants(consultant) 之类的方式在 post 方法中添加新对象,当我保存到 EF 时,它会获取它的 ID。但是如何对程序对象做同样的事情并通过 EF 将其保存到数据库中呢?

【问题讨论】:

    标签: asp.net entity-framework-4 asp.net-mvc-3


    【解决方案1】:

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

    Model Binding To A List

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

    Editing a variable length list, ASP.NET MVC 2-style.

    这些资源应该能让你一路走好。

    【讨论】:

    • 这看起来很有趣。我去看看,谢谢!
    • 好的,这是一个很好的链接,但不幸的是我无法让它完全正常工作。请查看我的更新...
    • 好的,它至少让我走到了一半,所以我会在这里解决这个问题,并开始一个新问题。谢谢。
    • 这仍然是最好的方法吗?感觉就像一个黑客。
    【解决方案2】:

    您可以查看有关编写自定义对象模板的following blog post。也不要在您的视图中使用 EF 模型。设计视图模型是专门为给定视图的需求量身定制的类,并在 EF 模型和应传递给视图的视图模型之间映射控制器。 AutoMapper 是一个可以简化此映射的好工具。

    【讨论】:

    • 感谢您的建议。我知道在很多情况下应该使用 ViewModel,但是当我想创建一个新的顾问时,我会通过创建一个包含基本相同属性的全新 ViewModel 来获得什么吗?或者你的意思是 ViewModel 应该是什么样子?
    猜你喜欢
    • 2011-08-25
    • 2012-10-26
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多