将数据从视图传递到控制器操作(httpget)到另一个视图到同一控制器操作(httppost)

时间:2017-01-21 19:20:09

标签: asp.net-mvc asp.net-mvc-4

我正在尝试从我通过id显示论坛帖子的视图中发布评论。这是我的观点得到的模型:

    @model PostViewModel

模型具有“Id”属性,我使用javascript发送给控制器:

    <script>
    $("#target").click(function () {
        $("#formPlace").load('@Url.Action("AddComment","Posts", new { postId = Model.Id })');            
    });
    </script>

这是我将“postId”发送到:

的控制器操作
    [HttpGet]
    public ActionResult AddComment(int postId)
    {
        var comment = new CommentViewModel();
        comment.PostId = postId;
        return this.PartialView("_AddComment", comment);
    }

此视图返回一个表单,用户必须填写评论的内容:

    @model MvcTemplate.Web.ViewModels.Posts.CommentViewModel
    <div>
    @using (Html.BeginForm("AddComment", "Posts", FormMethod.Post))
    {
    <div>Enter your comment here:</div>
    <div>
        @Html.TextAreaFor(x => Model.Content)
    </div>
    <input type="submit" name="Submit" />
    }
    </div>

当视图收到模型时,其“PostId”仍然正确=我用javascript设置它。但是,在用户提交表单后,发送到控制器的CommentViewModel对于“PostId”具有0(默认int值)。这是控制器动作:

    [HttpPost]
    public ActionResult AddComment(CommentViewModel viewModel)
    {
        // transfer the view model to db model and save;
    }

知道如何保持正确的PostId吗?

3 个答案:

答案 0 :(得分:1)

当您将表单提交到AddComment操作方法时,默认模型绑定器将尝试将表单字段值绑定到CommentViewModel对象的属性。您的表单有Content属性的输入字段,但您没有PostId的字段。因此浏览器将仅发送名称为Content的表单元素的值。

如果您想要PostId,您需要在表单中保留Post id值。由于用户不需要查看/编辑它,您可以将其保存在表单中的隐藏输入字段中。

您可以使用Html.HiddenFor辅助方法生成隐藏字段,其中包含相应属性的名称和值。

@using (Html.BeginForm("AddComment", "Posts", FormMethod.Post))
{
  <div>Enter your comment here:</div>
  <div>
    @Html.TextAreaFor(x => Model.Content)
  </div>
  @Html.HiddenFor(s=>s.PostId)
  <input type="submit" name="Submit" />
}

或者只是一个隐藏的输入元素标记(帮助程序最终只生成它)

<input type="hidden" name="PostId" value="@Model.PostId" />

答案 1 :(得分:0)

您需要在表单中放置具有PostId值的隐藏字段。您只发布内容。或者,您的帖子操作AddComment应该有url参数postId,因此表单的操作URL将包含postId。

答案 2 :(得分:0)

您可以在TempData中设置PostId,并可以在控制器中进行后续操作。如果你想从视图中获取它,你需要按照Shyju建议的隐藏字段进行设置。