C# 将全局对象传递回视图

C# 将全局对象传递回视图,c#,asp.net-mvc,asp.net-core,C#,Asp.net Mvc,Asp.net Core,我在自学asp.NETC#MVC,并不真正理解如何将数据带回视图 所有教程示例都很简单,即 1) 创建模型(书本) 2) 在控制器中,您可以创建一个图书对象(并复制到ViewModel中),即作者和标题以及章节集合。 3) 在视图中引用视图模型对象,例如@Model.Title等 然而,在我的例子中,我有一个之前已经创建的对象,我想将其发送回视图 比如说。假设一个图书馆有一本在controller1中创建的书。(这称为book1,然后返回到视图 我有另一个控制器(控制器2),它将为book1添加

我在自学asp.NETC#MVC,并不真正理解如何将数据带回视图

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

然而,在我的例子中,我有一个之前已经创建的对象,我想将其发送回视图

比如说。假设一个图书馆有一本在controller1中创建的书。(这称为book1,然后返回到视图

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

因此,问题是:

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

实际上,控制器不应缓存它创建的对象。如果您有GET Edit用例,让数据库存储对象并再次检索它。 您不想记住请求之间的状态(RESTful体系结构)。 这意味着您必须发送操作所需的所有数据作为参数

因此,假设您有一个BookController,它具有CreateBook操作。 此操作应返回数据库中创建的图书的ID。 (或者它返回一个视图,其中用于编辑书籍的ActionLink使用正确的ID初始化)。 必须将此Id传递给编辑现有书籍的所有操作

例如,在创建书籍后显示的视图中:

@Model ExistingBookViewModel

@Html.ActionLink("Add chapter", "AddChapter", "Chapter", new { bookId = Model.Id })
这里,
ExistingBookViewModel.Id
是在BookController中设置的已创建书本的Id

然后您的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);
}
a) 我会将模型与任何控制器文件分开,并通过包含名称空间在任何需要的控制器/视图中引用它。这将使会议有条理


b) 您可以使用该方法将任何模型传递给视图,但是视图应该定义该模型(例如-
@model MyApp.Models.MyModel
),以便使用它。从那里,您可以使用将模型绑定到视图来显示数据。

在任何类中创建静态变量,其他类中都可以访问该变量

但为什么不再次选择对象呢?性能不错,但简单且无bug的算法更为重要

如果要缓存数据库,请考虑缓存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;
}

我认为这是一个很好的答案。只需一个细节-您可以返回更新的图书模型以查看,而不是HttpStatusCodeResult。感谢您的详细回复!