将Massive列表传递给MVC3中的View

Nat*_*ing 6 c# asp.net-mvc asp.net-mvc-3

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();
        }
Run Code Online (Sandbox Code Playgroud)

这部分效果很好.但是我该怎么做?

return View(posts);
Run Code Online (Sandbox Code Playgroud)

如果我@posts.PostID在视图中引用,它会出错并说它无效.所以我尝试针对DynamicModel创建强类型视图,但posts仍然不存在.

我知道我可以创建一个ViewModel并针对该类型键入视图并将数据插入其中.这更多是关于理解Controller/View如何交互.

谢谢!

Geo*_*atz 10

首先,您需要创建一个类.例如:

public class Post : DynamicModel
{
    public Post(): base("db")
    {
       PrimaryKeyField = "PostID";
    }

}
Run Code Online (Sandbox Code Playgroud)

在Controller中,您可以:

public ActionResult Index()
        {
            var table = new Post();
            var posts = table.All();

            return View(posts);
        }
Run Code Online (Sandbox Code Playgroud)

因此,您可以创建一个强类型视图,并将视图模型设置为IEnumerable.视图将如下所示:

@model IEnumerable<dynamic>

<h2>Index</h2>
<ul>
@foreach (var item in Model)
{
    <li>@item.PostID</li>
}
</ul>
Run Code Online (Sandbox Code Playgroud)


Ali*_*tad 2

ASP NET MVC 模板是解决方案。

首先,ViewData不鼓励使用,尤其是在 MVC 2.0 和 3.0 中,其中有许多更好的方法将状态传递给视图。

强类型视图是正确的选择。但是如果你有一个收藏要传递怎么办?那么,您仍然可以为集合(或通用列表)创建强类型视图,但标准解决方案是为项目而不是集合使用 ASP NET MVC 模板(即 ascx 文件),并在父视图上调用 RenderPartial:

例如:

        <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>
Run Code Online (Sandbox Code Playgroud)

这里有一个关于这个主题的非常好的系列。