Кажется, я не могу сэкономить часть своих уроков. Я использую Code First EF. Вот мои классы:
public class ClassA
{
public int Id { get; set; }
public string Name { get; set; }
public virtual IList<Resource> Resources { get; set; }
}
public class Resource
{
public int Id { get; set; }
public string Role { get; set; }
public Location Location { get; set; }
public ClassA ClassA { get; set; }
}
public class Location
{
public int Id { get; set; }
public string Name { get; set; }
}
Мое представление редактирования имеет:
<table>
<thead>
<tr>
<th class="shaded">
@Html.Label("Level/Role")
</th>
<th class="shaded">
@Html.Label("Location")
</th>
</tr>
</thead>
<tbody id="tbResources">
@{
for (int i = 0; i < Model.Resources.Count; i++)
{
<tr>
<td>
@Html.HiddenFor(model => model.Resources[i].Id)
@Html.EditorFor(model => model.Resources[i].Role, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Resources[i].Role, "", new { @class = "text-danger" })
</td>
<td>
@Html.DropDownListFor(model => model.Resources[i].Location.Id, new SelectList(ViewBag.AvailableLocations, "Id", "Name"), new { @class = "form-control" })
</td>
</tr>
}
}
</tbody>
</table>
Контроллер:
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
ClassA classA = db.ClassAs.Find(id);
if (classA == null)
{
return HttpNotFound();
}
ViewBag.AvailableLocations = db.Locations.ToList();
return View(classA);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(ClassA classA)
{
if (ModelState.IsValid)
{
db.Entry(classA).State = EntityState.Modified;
foreach (var member in classA.Resources)
{
member.Location = db.Locations.SingleOrDefault(l => l.Id == member.Location.Id);
db.Entry(member).State = (member.Id == 0) ? EntityState.Added : EntityState.Modified;
}
db.SaveChanges();
return RedirectToAction("Index");
}
return View(classA);
}
Когда я редактирую запись ClassA, она сохраняет соответствующие Поле «Роль» ресурса изменяется в форме, но не «Местоположение».
Если у кого-то есть какие-либо идеи, пожалуйста, дайте мне знать.
Кроме того, я думал о создании ViewModel, объявив его следующим образом: publi c class ClassAViewModel: ClassA, а затем используя AutoMapper для сопоставления всех атрибутов, поскольку у меня так много на «реальном» ClassA. Есть мысли об этом подходе?
Я ценю вашу помощь. - Ред.