2013-04-09 5 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

ответ

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

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

Ahh cool .. Думаю, я могу сделать это через ViewBag, а потом? Как «var comment в ViewBag.Comments» и назначить его у моего контроллера? – aventic

+0

Это не очень хорошая практика –

+0

Да, конечно, лучше для пользователя ViewBag, если вы в MVC3 +, на самом деле я woking с MVC2 ... :-p –

Смежные вопросы