1

私はaspnetMvcを初めて使用し、mvc 4で簡単なフォーラムを作成しようとしています。スレッドと投稿を作成して一覧表示することはできますが、既存のスレッドに新しい投稿を追加する方法がわからないようです。つまり、複数の投稿を特定のに接続できるようにしたいのですThreadId

それで、これを達成するための最良の方法は何ですか、私は値を持って私のに値を渡す必要があり@ActionLinkますか?または、PostControllerでこれを排他的に処理できますか?コードサンプルやヒントは大歓迎です。PostController Create methodThreadId

私は次のクラスを持っています:

public class Thread
{
    public int ThreadId { get; set; }
    public DateTime ? PostDate { get; set; }
    public string ThreadText { get; set; }
    public string ThreadTitle { get; set; }
    public virtual UserProfile UserProfile { get; set; }

    public virtual ICollection<Post> Posts { get; set; }
}    

public class Post
{        
    public int PostId { get; set; }
    public string PostTitle { get; set;}
    public string PostText { get; set; }
    public DateTime ? PostDate { get; set; }
    public virtual UserProfile UserProfile { get; set; }

    public virtual Thread Thread { get; set; }
    [System.ComponentModel.DataAnnotations.Schema.ForeignKey("Thread")]
    public int ThreadId { get; set; }        
}
4

1 に答える 1

1

目的を達成する方法はいくつかあります。ここでは、厳密に型指定されたビューを使用したアプローチを紹介します。

ViewThreadDetailというビューがあり、特定のスレッド IDに属する投稿のリストがあり、そこに新しい投稿を送信することもできると仮定します。

ThreadController.cs:

public class ThreadDetailViewModel
{
    public Thread Thread { get; set; }

    public Post NewPost { get; set; }
}

public ActionResult ViewThreadDetail(int id)
{
    // load thread from database
    var thread = new Thread(){ ThreadId = id, ThreadTitle = "ASP.Net MVC 4", Posts = new List<Post>()};
    // assign ThreadId of New Post
    var newPost = new Post() { PostTitle = "", PostText = "", ThreadId = id };

    return View(new ThreadDetailViewModel() { Thread = thread, NewPost = newPost });
}

ViewThreadDetail.cshtml

@model MvcApplication1.Models.ThreadDetailViewModel

@{
    ViewBag.Title = "ViewThreadDetail";
}

<h2>ViewThreadDetail</h2>

<p>List of Posts:</p>
@foreach (var post in Model.Thread.Posts)
{
    <div>@post.PostTitle</div>
}

<p>Add a Post:</p>
@Html.Action("NewPost", "Post", Model.NewPost)

新しい投稿を送信するには、NewPost という PartialView が必要です。

@model MvcApplication1.Models.Post

@using(Html.BeginForm("Add", "Post"))
{
    @Html.LabelFor(a=>a.PostTitle);
    @Html.TextBoxFor(a => a.PostTitle);

    @Html.LabelFor(a => a.PostText);
    @Html.TextBoxFor(a => a.PostText);

    //A hidden field to store ThreadId
    @Html.HiddenFor(a => a.ThreadId);

    <button>Submit</button>
}

PostController.cs

public ActionResult NewPost(Post newPost)
{
     return PartialView(newPost);
}

public ActionResult Add(Post newPost)
{
     // add new post to database and redirect to thread detail page
     return RedirectToAction("ViewThreadDetail", "Thread", new { id = newPost.ThreadId });
}
于 2013-01-22T18:36:16.420 に答える