我正在教自己asp.net C#MVC并没有真正理解如何将数据带回视图。
所有教程示例都很简单,即 1)创建模型(书) 2)在控制器中,您可以创建一个书籍对象(并复制到ViewModel中),即作者和标题以及一组章节。 3)在视图中引用View Model对象,即@ Model.Title等。
但是在我的情况下,我有一个先前已创建的对象,我想将其发送回视图。
例如。想象一下,库中有一本在controller1中创建的书。 (这称为book1,然后返回视图。
我有另一个控制器(controller2),它将为book1添加一个新的章节。
所以问题是:
a)创建book1的最佳位置在哪里,以便我可以在所有控制器中引用? b)一旦创建了book1对象,它将如何返回到View中 - 从我的示例中可以看出,只有在特定控制器中创建的对象才能返回到它们的关联视图?
答案 0 :(得分:1)
实际上,您的控制器不应该缓存它创建的对象。如果您有GET Edit用例,请让数据库存储对象并再次检索它。 您不希望记住请求之间的状态(RESTful架构)。 这意味着您必须将操作所需的所有数据作为参数发送。
因此,假设您有一个具有CreateBook操作的BookController。 此操作应返回数据库中已创建的Book的ID。 (或者它返回一个视图,其中使用正确的ID初始化用于编辑书籍的ActionLinks)。 必须将此ID传递给编辑现有图书的所有操作。
例如,在创建图书后显示的视图中:
@Model ExistingBookViewModel
@Html.ActionLink("Add chapter", "AddChapter", "Chapter", new { bookId = Model.Id })
此处,ExistingBookViewModel.Id
是已创建书籍的ID,并在BookController中设置。
然后你的ChapterController可以像这样定义AddChapter Action:
[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);
}
答案 1 :(得分:0)
a)我会将模型与任何控制器文件分开,并在包含命名空间所需的任何控制器/视图中引用它。这将保持井井有条。
b)您可以使用Controller.View方法将您想要的任何模型传递给View,但视图应该定义该模型(示例 - @model MyApp.Models.MyModel
)以便它使用它。从那里,您可以使用将模型绑定到视图以显示数据。
答案 2 :(得分:0)
在任何类中创建静态变量,它可以在其他类中访问。
但为什么不再选择对象呢?性能很好,但简单且无错误的算法更为重要。
如果要缓存数据库,请考虑缓存sql语句的结果:
string sql = "select ...";
string hash = "book_" + sql.GetHashCode();
Book b = null;
if (HttpRuntime.Cache[hash] != null)
{
b = (Book)HttpRuntime.Cache[hash];
}
else
{
b = SelectBookFromSql(sql);
HttpRuntime.Cache[hash] = b;
}