【问题标题】:Passing data from view to controller action(httpget) to another view to same controller action (httppost)将数据从视图传递到控制器操作(httpget)到另一个视图到相同的控制器操作(httppost)
【发布时间】:2017-01-21 19:20:08
【问题描述】:

我正在尝试启用从我按 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 吗?

【问题讨论】:

  • 我可以看看CommentViewModel的代码吗?

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


【解决方案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" />

【讨论】:

  • 正是我所说的,但有代码。这很快。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多