如何使用FormMethod.Post将内部类List项添加到ViewModel中?

时间:2013-12-14 04:49:06

标签: c# asp.net-mvc razor partial-views actionresult

我知道有很多关于@Html.Partial@Html.RenderPartial,甚至使用与@Html.Action[ChildActionOnly]一起使用PartialView();的问题,但我的问题因为它涉及FormMethod.Post而稍微复杂一点,所以对于这个新手来说,任何帮助都会非常受欢迎。首先让我在解释问题之前向您展示两个ViewModel:

    public class Article 
    {
    public int ArticleId {get; set;}
    public int UserId {get; set;}
    public virtual ICollection<Comment> Comments {get; set;}
    //...
    }

    public class Comment
    {
    public Comment(int AId, int UId)
    {
        UserId = UId;
        ArticleId = AId;
        Content = "";
        //...
    }
    public int CommentId {get; set;}
    public int ArticleId {get; set;}
    public int UserId {get; set;}
    //...
    }

所以我的@model BlogSite.Models.Article视图有一个局部视图,它根据ArticleId查询所有注释,并将它们注入到View~ / Article / Details / 5中(想要根据标题重新路由URL,但这是为了另一天)使用@Html.Action("GetCommentsById", "Article", new { id = Model.ArticleId })就好了,但我使用种子方法将注释添加到数据库,所以我的问题是在使用表单时。我需要在PartialView @model BlogSite.Models.Comment中提交FormMethod.Post之前传递ArticleId。

以下是我尝试做的事情,因为Comment对象为null。

这是注入Details.cshtml

@model BlogSite.Models.Comment

@using (Html.BeginForm("Post", "Article", FormMethod.Post))
    {
    @Html.ValidationSummary(true)
    <div id="post-area">
        @Html.TextBoxFor(m => m.Content, new { @class = "textarea" })
    </div>
    <div id="post-info">
        <input type="submit" value="Post" title="Post" class="post-button" />
    </div>
}

以下是Detail.cshtml的部分以及我尝试过的选项:

 @Html.Action("AddComment", new { AId = Model.ArticleId, UId = WebSecurity.CurrentUserId })

以下是GET / POST控制器操作:

[HttpGet,  ChildActionOnly]
ActionResult AddComment(int AId, int UId)
{
Comment comment = new Comment(AId, UId);

return PartialView("_AddPostPartial", comment);
}

 [HttpPost,ActionName("Post")]
 public ActionResult AddComment(Comment comment)
 {
        if (ModelState.IsValid)
        {
            unitOfWork.ArticleRepository.InsertComment(comment);
            RedirectToAction("Details", "Article", new { id = comment.ArticleId });
        }

        return PartialView("_AddPostPartial", comment);
 }

问题是当我调试应用程序时,HttpGet中的注释没有保存两个整数的值。我认为Comment对象将在堆上,但它表示它为null。有人能指出我正确的方向吗?我知道Ajax和JSON最终将成为我使用的解决方案,但我仍然需要先使用这些操作。提前致谢!请随意尽可能地批评: - )

*注意我想知道我是否甚至需要PartialView为@Model.Comment?我基本上可以从View中传递我需要的参数来创建Comment对象,但是不是必须有一种方法来使用表单在ViewModel中创建不是主视图中ViewModel实例的新对象吗?我也明白我实际上是在使用[ActionName(“Post”)]在动作中调用相同的动作所以我不喜欢我这样做,所以我确信这是错误的。

<小时/> 所以是的,我是个白痴。我走开了几分钟然后去了商店然后回来找出来了。自我注意:即使RedirectToAction,也要确保使用关键字return!好的,我将分享我如何解决这个问题,所以如果其他人有问题,他们不会像我一样花费数小时。

以下是我在主视图中对Action的调用(Details.cshtml):

@Html.Action("AddComment", "Article", new { AId = Model.ArticleId })

这是Controller Action AddComment,它返回PartialView:

[HttpGet]
public ActionResult AddComment(int AId)
{
        Comment comment = new Comment(AId, WebSecurity.CurrentUserId);

        return PartialView("_AddPostPartial", comment);
}

注意:必须实例化ModelView对象并将其传递给部分视图

这是_AddPostPartial PartialView,它承载将实例化对象发布到服务器的Form。然后我将把我的InsertComment(评论评论)调用到我的UoW中,其中包含我在ActionResult Post中看到的所有存储库:

@model BlogSite.Models.Comment


    @using (Html.BeginForm("Post", "Article", FormMethod.Post)){
        @Html.ValidationSummary(true)
        @Html.HiddenFor(model => model.ArticleId)
        <div id="post-area">
            @Html.TextAreaFor(m => m.Content, new { @id = "comment", @class = "textarea", @name = "comment" })
        </div>

        <div id="post-info">
            <input type="submit" value="Post" class="post-button" />
        </div>
    }
        <script>
            $("form").submit(function (event) {
                $("textarea[name=comment]").val("");
            });

        </script>

这是ActionResult帖子:

[HttpPost]
public ActionResult Post(Comment comment)
{

    if (ModelState.IsValid)
    {
    unitOfWork.ArticleRepository.InsertComment(comment);
     return RedirectToAction("Details", "Article", new { id = comment.ArticleId });
    }

    return PartialView("_AddPostPartial", comment);
}

通过使用UnitOfWork,我确保我将重新注入更新的注释 对于文章(例如ArticleId = 5)此函数位于在UnitOfWork中实例化的存储库中:

    public void InsertComment(Comment comment)
    {
        // actual insert of comment into database
        context.Comments.Add(comment);
        Article article = context.Articles.Find(comment.ArticleId);
        UserProfile commenter = context.Users.Find(comment.UserId);
        // in-memory List for both User and Article 
        article.Comments.Add(comment);
        commenter.Comments.Add(comment);
        context.Entry(article).State = EntityState.Modified;
        context.Entry(commenter).State = EntityState.Modified;
        Save();
    }

注意:我认为将评论添加到用户和文章的虚拟列表非常重要。当我拿出后两个Adds时,return RedirectToAction("Details", "Article", new {comment.ArticleId});使我认为他们在内存中创建ER时,新注释没有呈现?我的实际文章和用户域模型都有ICollection<Comment> Comments {get; set; }所以也许这就是我需要这样做的原因。我认为在这种情况下使用界面会好得多,但如果我错了,请纠正我?

0 个答案:

没有答案