Я работаю над формой с родительско-дочерними отношениями (один ко многим), используя MVC 5/EF 6.1. Я пытаюсь отобразить дочерние элементы через частичное представление, которое не будет отображаться или выдавать мне какие-либо ошибки (при создании новой формы). Я попытался запустить отладчик и не увидел ничего плохого (хотя я уверен, что он есть).
Пока это то, что у меня есть:
Модели
public class Parent
{
public int ParentID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<Child> Childs { get; set; }
}
public class Child
{
public int ChildID { get; set; }
public int ParentID { get; set; }
public string Name { get; set; }
public string DOB { get; set; }
public string Address { get; set; }
public virtual Parent Parent { get; set; }
}
ViewModels
public class ParentVM
{
public ParentVM()
{
//Children = new List<ChildVM>()
// {
// new ChildVM(){Name="1", DOB="1", Address="1"},
// new ChildVM(){Name="1", DOB="1", Address="1"},
// new ChildVM(){Name="1", DOB="1", Address="1"},
//};
Children = new List<ChildVM>();
}
public int ParentID { get; set; }
public int ChildID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Name { get; set; }
public string DOB { get; set; }
public string Address { get; set; }
public IList<ChildVM> Children { get; set; }
}
public class ChildVM
{
public int ChildID { get; set; }
public int ParentID { get; set; }
public string Name { get; set; }
public string DOB { get; set; }
public string Address { get; set; }
}
Просмотр (созданный с помощью шаблонов: Индекс, Детали, Изменить, Создать, Удалить)
@model SomeNamespace.ViewModels.ParentVM
@{ViewBag.Title = "Create";}
<h2>Create</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Parent</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.FirstName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.FirstName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.FirstName, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.LastName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.LastName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.LastName, "", new { @class = "text-danger" })
</div>
</div>
<table border="1">
<tr>
<th>Name</th>
<th>DOB</th>
<th>Address</th>
</tr>
@Html.EditorFor(x => x.Children)
</table>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>}
<div>@Html.ActionLink("Back to List", "Index")</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")}
Частичный просмотр (Views/Shared/EditorTemplates/Child.cshtml)
@model SomeNamespace.Models.Child
<tr>
<td>
@Html.EditorFor(model => model.Name)
</td>
<td>
@Html.EditorFor(model => model.DOB)
</td>
<td>
@Html.EditorFor(model => model.Address)
</td>
Controller (ParentsController.cs)
// GET: Parents/Create
public ActionResult Create()
{
//var viewModel = new ParentVM
//{
// Children =
// new List<ChildVM>()
// {
// new ChildVM() {Name="1", DOB="1", Address="1"},
// new ChildVM() {Name="1", DOB="1", Address="1"},
// new ChildVM() {Name="1", DOB="1", Address="1"}
// }
//};
return View(new ParentVM());
//return View(viewModel);
}
// POST: Parents/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see https://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ParentID,FirstName,LastName, Name")] ParentVM viewModel)
{
if (ModelState.IsValid)
{
var child = new Child()
{
//Name = viewModel.Name,
//DOB = viewModel.DOB,
//Address = viewModel.Address
};
var parent = new Parent()
{
//FirstName = viewModel.FirstName,
//LastName = viewModel.LastName
};
db.Parents.Add(parent);
db.Childs.Add(child);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(viewModel);
}
Это то, что я вижу в исходном коде:
<table border="1">
<tr>
<th>Name</th>
<th>DOB</th>
<th>Address</th>
</tr>
</table>
Может типа не нравится? Я думал, вы можете использовать модель в частичном представлении (editorTemplates)??
EditorTemplate
, чтобы оно совпадало!Views/Shared/EditorTemplates/ChildVM.cshtml
24.11.2014ChildVM
в конструктореParentVM
, так что список пуст, так что отображать нечего! 24.11.2014DOB
Я предполагаю, что этоDateOfBirth
, так почему же этоstring
, а неDateTime
? Просто используйте@Html.TextBoxFor()
для вашихstring
типов. Включениеpublic int ParentID { get; set; }
в модель представления кажется бессмысленным, и вы не включили свойство ID (необязательное в методе создания, поскольку оно не существует в базе данных, но может быть необходимо в форме редактирования). И удалите[Bind(Include="..")]
из метода POST (на самом деле вы исключаетеChildren
!). Вам никогда не придется использоватьBindAttribute
, если у вас есть модель представления. 24.11.2014