我正在尝试从我通过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吗?
答案 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建议的隐藏字段进行设置。