Создать представления для свойств объекта в модели в приложении MVC 3? - PullRequest
1 голос
/ 16 февраля 2011

У меня есть приложение Asp.Net MVC 3 с базой данных «Консультанты», к которому обращается EF. Теперь таблица «Консультант» в базе данных имеет отношение «один ко многим» с несколькими другими таблицами для получения информации о типе резюме (опыт работы и т. Д.). Таким образом, пользователь должен иметь возможность заполнить свое имя и т. Д. Один раз, но должен иметь возможность добавить ряд «опыта работы» и т. Д.

Но эти таблицы внешних ключей являются сложными объектами в модели, и при создании представления Create я получаю только простые свойства в качестве полей редактора. Как мне спроектировать представление или представления, чтобы сложные объекты также можно было заполнять? Я представляю себе представление, в котором простые свойства представляют собой простые поля, а затем какой-то элемент управления, в котором можно нажать «добавить опыт работы», и будет добавлено столько, сколько необходимо. Но как бы я это сделал и использовал привязку модели? На самом деле, я вообще не знаю, как это сделать. (Кстати, программа и язык означают такие вещи, как опыт работы с программным обеспечением в целом и знание естественного языка, а не языки программирования, если вам интересно узнать об их отношениях).

Любые идеи с благодарностью!

Вот Create View, созданный командой add 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

Обновление:

Согласно предложению, я попробовал блог-решение Стивена Сандерсона, но не могу заставить его работать должным образом. Я добавил это на главном экране:

    <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. Я использую объект «Консультант» в качестве возвращаемого параметра, но свойство «Программы» не содержит программы. Возможно, это связано с тем, что я не могу заставить работать помощник BeginCollectionItem, но в любом случае я не понимаю, как это сделать или как добраться до Программы, предположительно добавленной в представление. С помощью простого объекта я бы добавил новый объект в методе post с помощью чего-то вроде _repository.AddToConsultants (консультант), а когда я сохраняю в EF, он получает свой идентификатор. Но как мне сделать то же самое с программным объектом и сохранить его в базе данных через EF?

Ответы [ 2 ]

1 голос
/ 16 февраля 2011

Фил Хаак написал отличный пост в блоге, который объясняет, как моделировать привязку к списку. Это специфично для MVC2, но я не уверен, что версия 3 улучшила это.

Привязка модели к списку .

В сценарии, когда пользователю разрешено добавлять произвольное количество элементов, вы, вероятно, захотите создать новые поля ввода с помощью JavaScript. Стивен Сандерсон показывает, как этого добиться:

Редактирование списка переменной длины в стиле ASP.NET MVC 2 .

Эти ресурсы должны помочь вам в этом.

0 голосов
/ 16 февраля 2011

Вы можете взглянуть на следующую запись в блоге о написании пользовательских шаблонов объектов.Также не используйте модели EF в ваших взглядах.Разработайте модели представления, которые являются классами, специально разработанными для нужд данного представления и имеющими карту контроллера между моделями EF и моделями представления, которые должны быть переданы в представление. AutoMapper - хороший инструмент, который может упростить это отображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...