实际上,您的控制器不应该缓存它创建的对象。如果您有GET编辑用例,让数据库存储对象并再次检索它。 你不想记住请求之间的状态(RESTful体系结构)。 这意味着您必须发送操作所需的所有数据作为参数。
因此,让我们假设您有一个BookController具有CreateBook操作。 此操作应该返回数据库中创建的Book的ID。 (或者它返回一个视图,其中动作链接编辑书籍用正确的ID进行初始化)。 此ID必须传递给编辑现有书籍的所有操作。
例如,认为得到了一本书后显示已创建:
@Model ExistingBookViewModel
@Html.ActionLink("Add chapter", "AddChapter", "Chapter", new { bookId = Model.Id })
这里,ExistingBookViewModel.Id
是创建本书的ID和BookController的设置。
然后你ChapterController可以定义AddChapter操作是这样的:
[HttpGet]
public ActionResult AddChapter(long bookId) {
var book = dbContext.Books.Find(bookId);
var viewModel = new AddChapterViewModel {
BookId = bookId,
BookName = book.Name,
ChapterName = string.Empty // to be provided by User in AddChapter view
// ...
};
return View("AddChapter", viewModel);
}
[HttpPost]
public ActionResult AddChapter(AddChapterViewModel postData) {
var book = dbContext.Books.Find(postData.BookId);
var newChapter = new Chapter {
Name = postData.ChapterName,
// ...
};
book.Chapters.Add(newChapter);
dbContext.SaveChanges();
return new HttpStatusCodeResult(HttpStatusCode.OK);
}
这是在我看来,一个很好的答案。只需一个细节 - 您可以将更新后的书籍模型返回到View而不是HttpStatusCodeResult。 –
欣赏详细的回复! – Tysondotnet