将全局对象传回视图

时间:2017-01-16 10:57:30

标签: c# asp.net-mvc asp.net-core

我正在教自己asp.net C#MVC并没有真正理解如何将数据带回视图。

所有教程示例都很简单,即 1)创建模型(书) 2)在控制器中,您可以创建一个书籍对象(并复制到ViewModel中),即作者和标题以及一组章节。 3)在视图中引用View Model对象,即@ Model.Title等。

但是在我的情况下,我有一个先前已创建的对象,我想将其发送回视图。

例如。想象一下,库中有一本在controller1中创建的书。 (这称为book1,然后返回视图。

我有另一个控制器(controller2),它将为book1添加一个新的章节。

所以问题是:

a)创建book1的最佳位置在哪里,以便我可以在所有控制器中引用? b)一旦创建了book1对象,它将如何返回到View中 - 从我的示例中可以看出,只有在特定控制器中创建的对象才能返回到它们的关联视图?

3 个答案:

答案 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;
}