1

このシンプルなブログを行う方法を見つけようとしています。私はすべてのブログ投稿が一覧表示されているフロントページを持っています。ブログ投稿のタイトルをクリックすると、投稿全体が表示され、そこにコメントすることもできます。

私の問題は、コントローラーを介してモデルを渡そうとすると、投稿またはコメントのいずれかのモデルにしかアクセスできないことです。

これが私のモデルです:

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" />
}

私が星でマークしたのは、それが間違っていると思われる場所です..投稿モデルとコメントモデルの両方をこの詳細ビューに渡す必要があります。私の質問は、どうすればいいですか?

学ぼうとしているだけで、高度なものを作ろうとしているわけではありません。

よろしくお願いいたします。

4

2 に答える 2

1

db からのデータをモデルにマップする必要があります。

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");
        }   
}
于 2013-04-09T12:29:38.920 に答える
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;

お役に立てれば...:)

于 2013-04-09T12:43:14.250 に答える