2013-04-09 42 views
1

我试图找出一种方法来做到这一简单的博客。我有一个首页,其中列出了所有的博客文章,当您点击博客文章的标题时,您可以输入您可以发表评论的整篇文章。MVC:通过控制器查看多个模型

我的问题是,当我尝试通过控制器传递模型时,我只能访问我的模型之一,无论是帖子还是评论。

这里是我的模型:

public class Post 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public string Message { get; set; } 
    public string Author { get; set; } 
    public DateTime DateTime { get; set; } 

    public List<Comment> Comments { get; set; } 
} 

public class Comment 
{ 
    public int ID { get; set; } 
    public int PostID { get; set; } 
    public string Message { get; set; } 
    public string Author { get; set; } 
    public DateTime DateTime { get; set; } 
} 

这里是我的控制器:

public ActionResult Details(int id) 
{ 
    **var dbPosts = db.Posts.Find(id);** 

    return View(dbPosts); 
} 

这是我的观点:

@model Blog.Models.Post 

@{ 
    ViewBag.Title = "Details"; 
} 

<h2>@Html.ActionLink(Model.Title, "Details", new { id = Model.ID (@Html.ActionLink("Rediger", "Edit", new { id = Model.ID }) - @Html.ActionLink("Slet", "Delete", new { id = Model.ID }))</h2> 
<span class="written">skrevet d. @Model.DateTime.ToLongDateString() @Model.DateTime.ToShortTimeString() af @Model.Author</span> 
<p>@Model.Message</p> 
<hr /> 

@foreach (var comment in Model.Comments) { 
    <span class="written">skrevet d. @comment.DateTime.ToLongDateString() @comment.DateTime.ToShortTimeString() af @comment.Author</span> 
    <p>@comment.Message</p> 
    <hr /> 
} 

@using (Html.BeginForm()) { 
    <label for="Author">Author</label> 
    <input type="text" id="Author" name="Author" /> 

    <label for="Message">Message</label> 
    <textarea id="Message" name="Message"></textarea> 

    <input type="submit" value="Gem" /> 
    <input type="reset" value="Reset" /> 
} 

我打上星的事情是,我觉得它出错了..我需要让我的发布和评论模型通过这个详细信息视图。我的问题是,我该怎么做?

我并没有试图让任何先进的东西试图学习。

提前致以亲切的问候和感谢。

+0

是否是文章和评论POCO实体?你在用什么ORM? – Maess 2013-04-09 12:45:38

回答

1

您必须将数据从数据库与模型映射:

public ActionResult Details(int id) 
{ 
     var model = db.Posts.Where(x => x.Id == id).Select(x => new Post(){ 
      ID = x.Id, 
      Title = x.Title, 
      Message = x.Message 
     }).FirstOrDefault(); 

     if (model != null) 
     { 
      model.Comments = db.Comments.Where(x => x.PostId == model.ID).Select(x => new Comment(){ 
       ID = x.Id, 
       PostId = model.ID, 
       Message = x.Message 
      }).ToList(); 

      return View(model); 
     } 
     else 
     { 
      // post not found 
      return View("NotFoundError"); 
     } 
} 
+0

很好,谢谢它的工作:-)现在我得到的嵌套评论的博客文章,就像我的目标:) – aventic 2013-04-09 12:45:46

1

您还可以通过ViewData的传递,就像

public ActionResult Details(int id) 
{ 
    var dbPosts = db.Posts.Find(id); 
    // somtthing like that 
    var dbComments = db.Comments.Find(dbPost.ID); 
    ViewData["KEY_TO_COMMENTS"] = dbComments; 
    return View(dbPosts); 
} 

,然后在您查看您可以访问您的commects。 ..

@var comments = ViewData["KEY_TO_COMMENTS"] as Blog.Models.Comments; 

希望这有助于... :)

+0

啊凉爽..我想我可以通过ViewBag做到这一点吗?像“ViewBag.Comments中的var评论”,并从我的控制器分配它? – aventic 2013-04-09 12:44:28

+0

这不是很好的做法 – 2013-04-09 12:47:40

+0

是的,如果你在MVC3 +中,它对用户ViewBag更好,实际上我正在使用MVC2 ... :-p – 2013-04-09 12:49:24