ASP.NET MVC的新手(现在使用带Razor的MVC3),我很困惑将一个对象从Controller传递给View。具体来说,我正在试验MVC3和Rob Conery有趣的Massive(http://blog.wekeroad.com/helpy-stuff/and-i-shall-call-it-massive)。我正在搞一个博客作为一个简单的Web应用程序来试验。
HomeController.cs:
public ActionResult Index()
{
var table = new DynamicModel("mydb", tableName: "Posts");
//grab all the posts
var posts = table.All();
ViewData["Posts"] = posts;
return View();
}
这部分效果很好。但是我该怎么做呢?
return View(posts);
如果我在视图中引用@posts.PostID
,则会出错并说它无效。所以我尝试针对DynamicModel创建强类型视图,但posts
仍然没有。
我知道我可以创建一个ViewModel并针对该类型键入视图并将数据插入其中。这更多是关于理解Controller / View如何交互。
谢谢!
答案 0 :(得分:10)
首先,您需要创建一个类。例如:
public class Post : DynamicModel
{
public Post(): base("db")
{
PrimaryKeyField = "PostID";
}
}
在控制器中,您可以:
public ActionResult Index()
{
var table = new Post();
var posts = table.All();
return View(posts);
}
因此,您可以创建强类型视图并将视图模型设置为IEnumerable。视图将是这样的:
@model IEnumerable<dynamic>
<h2>Index</h2>
<ul>
@foreach (var item in Model)
{
<li>@item.PostID</li>
}
</ul>
答案 1 :(得分:2)
ASP NET MVC模板是解决方案。
首先,不鼓励使用ViewData
,尤其是在MVC 2.0和3.0中,有很多更好的方法可以将状态传递给视图。
强类型视图是要走的路。但是,如果你有一个集合通过怎么办?好吧,您仍然可以为集合(或通用列表)创建强类型视图,但标准解决方案是使用ASP NET MVC模板(ascx文件)作为项而不是集合,并在父视图上调用RenderPartial: / p>
例如:
<div>
<% for (int i = 0; i < Model.Bars.Count; i++)
{%>
<h3>
<a href="#">Bar
<%: String.Format("{0:g}", Model.Bars[i].DocumentDate.ToShortDateString())%></a></h3>
<div>
<%: Html.DisplayFor(m => m.Bars[i].Content)%>
</div>
<%}%>
</div>
关于这个主题有一个很好的系列here。