在MVC3中将大量列表传递给视图

6
新手学习ASP.NET MVC(现在使用MVC3和Razor),我对从控制器传递对象到视图感到困惑。具体来说,我正在尝试使用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并将视图与其类型化,然后将数据插入其中。这更多地涉及到了解控制器/视图之间的交互。
谢谢!
2个回答

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>

谢谢 GeoChatz!我之前不知道 IEnumerable<dynamic> 这个东西。 - Leonardo

2

ASP NET MVC模板是解决方案。

首先,在MVC 2.0和3.0中,使用ViewData是不鼓励的,因为现在有更好的方法来传递状态到视图。

强类型视图是正确的选择。但是,如果您有一个要传递的集合呢?那么,您仍然可以为集合(或泛型列表)创建强类型视图,但标准解决方案是使用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>

这个主题有一系列非常好的内容,在这里可以找到。


好的,但是我如何将“posts”对象传递给局部视图呢?我创建了一个强类型视图,但它失败了... - Nathan Loding
你可以直接使用 DisplayForEditorFor - Aliostad
我使用Massive创建了一个强类型视图,针对DynamicModel对象。我还尝试了针对我的MVC.Models.Posts对象。然后我运行了return View(posts);并尝试在视图中引用posts。但是它失败了,说posts不存在。DisplayForEditorFor与此有什么关系?我完全困惑了! - Nathan Loding
我的解决方案是使用模板,你可以称之为DisplayFor或EditorFor。你也可以使用RenderPartial。 - Aliostad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接