У меня есть приложение 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:
Обновление:
Согласно предложению, я попробовал блог-решение Стивена Сандерсона, но не могу заставить его работать должным образом. Я добавил это на главном экране:
<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?