2017-01-16 67 views
1

我在教自己的asp.net C#MVC,我并不真正了解如何将数据带回视图。将全局对象传递回查看

所有实例教程是微不足道即 1)创建一个模型(书) 2)创建一本书对象控制器(和复制到一个视图模型),即作者和书名和章节的集合。 3)在视图中引用视图模型对象,即@ Model.Title等

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

例如。想象一下,一个图书馆有一本在controller1中创建的书。 (这就是所谓的BOOK1,然后返回到视图

我还有一个控制器(控制器2),将新的篇章添加到BOOK1

所以问题是:。

一)在哪里创建book1的最佳位置,以便我可以在所有控制器中参考? b)一旦book1对象被创建,它如何返回到视图 - 从我的例子看来,只有在特定控制器内创建的对象才能返回到它们相关的视图?

回答

1

实际上,您的控制器不应该缓存它创建的对象。如果您有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); 
} 
+0

这是在我看来,一个很好的答案。只需一个细节 - 您可以将更新后的书籍模型返回到View而不是HttpStatusCodeResult。 –

+0

欣赏详细的回复! – Tysondotnet

0

一)我想保持模型的任何控制文件单独和任何控制器/视图,其中它是由包括命名空间需要引用它。这将保持组织。

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

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