将ViewModel中的数据保存在局部视图中传递给表单,然后再传递给Controller

时间:2017-12-19 19:46:28

标签: c# asp.net-mvc forms razor

我正在构建一个包含一个简单表单的应用程序,以便为帖子添加评论。

由于我项目中的其他组件允许用户提交评论并使用此表单,因此我决定在部分视图中包含该表单,如下所示:

@model Assignment_3.ViewModels.DetailViewModel

        @using (Html.BeginForm("AddComment", "Comments", new { m = Model })) 
        {
                <div class="col-md-6">
                    <div class="form-group">
                        @Html.LabelFor(m => m.CommentSubmission.Translation, new { @class = "control-label" })
                        @Html.TextBoxFor(m => m.CommentSubmission.Translation, new { @class = "form-control" })

                    </div>
                </div>

           <div class="col-md-2">
                    <div class="form-group">
                        @Html.LabelFor(m => m.CommentSubmission.LanguageId, new { @class = "control-label" })
                        @Html.DropDownListFor(m => m.CommentSubmission.LanguageId,
                 Model.CommentSelectListItems, "", new { @class = "form-control" })
                    </div>
                </div>
                <div class="row">
                    <div class="col-md-12">
                        <div class="form-group">
                            @Html.TextAreaFor(m => m.CommentSubmission.Body, 7, 15, new { @class = "form-control" })
                       </div>
                    </div>
                </div>

                <div class="col-md-1">
                    <input type="submit" class="btn btn-danger" value="AddComment" />
                </div>

        }

链接到此部分视图的视图将其ViewModel(DetailViewModel)传递给它。此模型包含有关Post的信息,例如PostId,评论与之相关。

主视图链接到部分视图,如下所示:

@Html.Partial("_AddComment", Model);

用户提交后,表单会调用它的action方法,返回从“Post”页面继承的视图:

(控制器)

    [HttpPost]
    public ActionResult AddComment(DetailViewModel view)
    {
        if (ModelState.IsValid)
        {
            _context.CommentSubmissions.Add(view.CommentSubmission);
            _context.SaveChanges();

             return RedirectToAction("Detail", "Posts", new { id = view.CommentSubmission.IdiomId });
        }
        view.Init(_context);
        return View(view);
    }

我注意到的是,虽然ViewModel确实返回了表单中收集的信息,但它并没有从Post的DetailViewModel中继承原始信息。因此,当我调用“RedirectToAction”时,id为null,因为有关PostID的信息已丢失。

我仍然是MVC的新手,并且有助于坚持/或者其他优化的方法会受到赞赏。

答案(感谢msoliman):

已添加到表单:

@Html.HiddenFor(m => m.Post.PostId)

将控制器更新为:

    [HttpPost]
    public ActionResult AddTranslation(DetailViewModel view)
    {
        if (ModelState.IsValid)
        {
            view.CommentSubmission.IdiomId = view.Post.PostId;

            _context.TranslationSubmissions.Add(view.CommentSubmission);
            _context.SaveChanges();

            return RedirectToAction("Detail", "Posts", new { id = view.CommentSubmission.PostId });

        }

        //view.Init(_context);
        return View(view);

    }

1 个答案:

答案 0 :(得分:1)

我想我理解你的问题,但是如果我误解了请发表评论,我会非常乐意更新我的回答并帮助你。

您尝试发送帖子数据而您的表单只有评论字段,如果您想从帖子中添加字段,请添加要传递给表单的数据的隐藏字段。还要确保您的评论视图模型具有此字段。

在表单中添加类似这样的内容

@Html.HiddenFor(m => m.PostID) 

此外,您应该在其中定义PostID字段评论的视图模型(DetailViewModel)将从您的视图或表单操作传递到控制器。