0

MVCを使用して簡単なフォーラムを作成しようとしていますが、返信を投稿しているユーザーが重複している理由がわかりません。

返信アクションは次のとおりです。

[HttpPost]
    public ActionResult Reply(string Title, string Content,int ReplyTo)
    {
        Post masterPost = db.Posts.FirstOrDefault(p => p.PostID == ReplyTo);
        Post post = new Post();
        post.PostID = 0;
        post.CreatedOn = DateTime.Now;
        post.ModifiedOn = DateTime.Now;
        post.ReplyTo = masterPost;
        post.Forum = db.Forums.FirstOrDefault(f=>f.ForumID == masterPost.Forum.ForumID);
        post.User = (User)Session["User"];
        post.Title = Title;
        post.Content = Content;

        //if (ModelState.IsValid)
        //{
            db.Posts.Add(post);
            db.SaveChanges();
            return RedirectToAction("View", "Posts", new { id = ReplyTo });
        //}
        return View(post);
    }

これはPostエンティティです:

public class Post
{
    [Key]
    public int PostID { get; set; }
    public string Title { get; set; }
    [DataType(DataType.MultilineText)]
    public string Content { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime? ModifiedOn { get; set; }
    public virtual Forum Forum { get; set; }
    public virtual User User { get; set; }
    public virtual Post ReplyTo { get; set; }
}

これはユーザーエンティティです。

public class User
{
    public int UserID { get; set; }
    public string Name { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }
    public DateTime RegisteredOn { get; set; }
}

ReplyToアクションが呼び出されるたびに、投稿が作成されますが、セッションに保存されているユーザー(別のユーザーID)も複製されます。

また、ModelState.IsValidについてコメントしました。これは、エンティティが完全に埋められていて、無効になる可能性のあるDataAnnotationsがないにもかかわらず、何らかの理由で常にfalseとして返されるためです。

編集 これはModelStateのエラーです: {"タイプ'System.String'からタイプ'Models.Post'へのパラメーター変換は、タイプコンバーターがこれらのタイプ間で変換できないため失敗しました。"}

私は何が間違っているのですか?

よろしくお願いします。

4

1 に答える 1

0

ModelState が無効である理由を説明できます。プロパティを必須にするために DataAnnotations を用意する必要はありません。プリミティブを null に設定することはできないため、それらも「必須」プロパティとしてカウントされ、提供されていない場合は ModelState が無効になります。

上記の例では、CreatedOn プロパティまたは PostId プロパティ (またはその両方) を投稿していないと思います。価値のある 2 つのプロパティ (タイトルとコンテンツ) のみを投稿しているため、これら 2 つのプロパティだけを含む単純なビュー モデルを作成することをお勧めします。それをしたくない場合は、2 つの名前付きパラメーターを受け入れることをお勧めします。

以下はビューモデルを使用した例です。ReplyTo プロパティをビュー モデルに追加できることに注意してください。

public class PostViewModel
{
    public int ReplyTo {get; set;}
    public string Title { get; set; }
    [DataType(DataType.MultilineText)]
    public string Content { get; set; }
 }

次のように使用できます。

    [HttpPost]
    public ActionResult Reply(PostViewModel viewModel)
    {
        Post masterPost = db.Posts.FirstOrDefault(p => p.PostID == viewModel.ReplyTo);
        Post post = new Post();
        post.PostID = 0;
        post.CreatedOn = DateTime.Now;
        post.ModifiedOn = DateTime.Now;
        post.ReplyTo = masterPost;
        post.Forum = db.Forums.FirstOrDefault(f=>f.ForumID == masterPost.Forum.ForumID);
        post.User = (User)Session["User"];
        post.Title = viewModel.Title;
        post.Content = viewModel.Content;

        if (ModelState.IsValid)
        {
            db.Posts.Add(post);
            db.SaveChanges();
            return RedirectToAction("View", "Posts", new { id = ReplyTo });
        }
        return View(post);
    }

ユーザーが重複しているということは、User クラスに Key 属性がないことが原因だと思います。

于 2013-02-08T16:16:37.267 に答える