将Massive列表传递给MVC3中的View

时间:2011-03-30 10:23:23

标签: 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();
        }

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

return View(posts);

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

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

谢谢!

2 个答案:

答案 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