2011-03-30 40 views
6

ASP.NET MVC的新手(现在使用MVC3与Razor),我很困惑从Controller传递一个对象到视图。具体来说,我正在尝试使用MVC3和Rob Conery的有趣Massive(http://blog.wekeroad.com/helpy-stuff/and-i-shall-call-it-massive)。我将博客作为一个简单的Web应用程序来进行试验。传递大量列表以查看MVC3

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,它会出错并表示它无效。所以我试着创建一个强大的动态模型视图,但posts仍然不存在。

我知道我可以创建一个ViewModel并输入视图并在那里插入我的数据。这更多的是了解Controller/View如何交互。

谢谢!

回答

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> 

有关于这一主题here一个很好的系列。

+0

公平不够 - 但如何将'posts'对象传递给部分视图?我创建了一个强类型的视图,它失败了...... – 2011-03-30 13:14:02

+0

你不只是说'DisplayFor'或'EditorFor' – Aliostad 2011-03-30 13:20:46

+0

我从Massive创建了一个强类型的DynamicModel对象视图。我也试图对付我的MVC.Models.Posts对象。然后我运行'返回查看(帖子);'并试图在视图中引用'帖子'。它轰炸了,说'帖子'不存在。 “DisplayFor”和“EditorFor”与此有什么关系?我完全困惑! – 2011-03-30 13:28:43

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> 
+0

感谢GeoChatz!不知道IEnumerable 。 – Leonardo 2011-09-27 05:33:19