MVC3 - как связать вновь созданный дочерний объект с его родителем? - PullRequest
3 голосов
/ 20 декабря 2011

Я полный новичок в MVC и, похоже, не могу разобраться с очень простой концепцией.

У меня есть родительский объект, который содержит коллекцию дочерних объектов.Я хочу создать новый дочерний объект и связать его с родительским объектом, сохраненным в базе данных через EF4

    public class Parent
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public virtual List<Child> Children { get; set; }
    }

. Пока что в моем самом простом приложении происходит следующее.Мой пользователь переходит на страницу с информацией о родительском объекте, которая включает в себя список текущих дочерних объектов.На этой странице также есть ссылка для добавления нового ребенка.Эта ссылка указывает на действие «Создать» на дочернем контроллере, передавая родительский идентификатор, который, в свою очередь, отображает представление для создания нового дочернего элемента.И вот где я застрял.Я не знаю, как сохранить предоставленный родительский идентификатор, чтобы при нажатии кнопки «Сохранить» я мог извлечь этот родительский объект и добавить свой новый дочерний объект в его коллекцию.

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

Любая помощь действительно приветствуется!

Большое спасибо Джерри

[Обновление 1]

У меня есть два действия CreateChild,изначально генерируется MVC, а затем модифицируется мной.Просто глядя на них, я вижу, что они не делают то, что мне нужно, но я не совсем уверен, как они должны измениться.В частности, я храню родительский идентификатор в ViewBag, но между вызовами действий Create он теряется и поэтому недоступен при вызове второго Create для сохранения нового дочернего элемента в базе данных.

</p> <pre><code>public ActionResult Create(int parentId) { Parent parent = db.Parents.Find(parentId); ViewBag.ParentId = parent.Id; return View(); } [HttpPost] public ActionResult Create(Child child) { if (ModelState.IsValid) { Parent parent = db.Parents.Find(ViewBag.ParentId); parent.Children.Add(child); db.Children.Add(child); db.SaveChanges(); return RedirectToAction("Index"); } return View(child); }

Еще раз спасибо Джерри

Ответы [ 2 ]

4 голосов
/ 20 декабря 2011

Когда вы передаете ParentId в действие add child, похоже, что вы делаете это с параметром маршрута.

Вместо того, чтобы хранить его в ViewBag, запишите его как скрытое поле в вашей дочерней форме.Затем, когда кто-то отправляет форму, ParentId будет передан вашему методу действия HttpPost.

Вы можете сделать это, сделав ParentId свойством для вашей дочерней модели.

public class Child
{
    public int ParentId { get; set; }
}

public ActionResult Create(int parentId)
{
    Parent parent = db.Parents.Find(parentId);
    var model = new Child { ParentId = parent.Id };
    return View(model);
}

По вашему мнению, представьте его следующим образом:

@Html.HiddenFor(m => m.ParentId)

Затем, во время вашего HttpPost, Child уже будет содержать ParentId - средство связывания для модели по умолчанию получит его из скрытогополе в вашей форме.

[HttpPost]
public ActionResult Create(Child child)
{
    if (ModelState.IsValid)
    {
        Parent parent = db.Parents.Find(child.ParentId);
        parent.Children.Add(child);
        db.Children.Add(child); // don't think you need this line
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(child);
}

Обновление после публикации ответа

Глядя на ваш код HttpPost, может быть неправильно добавлять ребенка в базу данных дважды.Если вы используете EF 4.1 или 4.2, я почти уверен, что это неправильно, но я не уверен насчет предыдущих версий EF.Добавление потомка в коллекцию parent.Children должно быть достаточным - я не думаю, что вы должны также добавить его в набор db.Children.

3 голосов
/ 20 декабря 2011

ViewBag не ViewState (ASP.NET MVC не имеет встроенного эквивалента ASP.NET WebForms ViewState) - он не будет хранить ParentId между вызовами. Это просто позволит вам передать ParentId для просмотра (в вашем первом действии), чтобы вы могли, например, сохранить его в скрытом поле.

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