我正在构建一个包含一个简单表单的应用程序,以便为帖子添加评论。
由于我项目中的其他组件允许用户提交评论并使用此表单,因此我决定在部分视图中包含该表单,如下所示:
@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);
}
答案 0 :(得分:1)
我想我理解你的问题,但是如果我误解了请发表评论,我会非常乐意更新我的回答并帮助你。
您尝试发送帖子数据而您的表单只有评论字段,如果您想从帖子中添加字段,请添加要传递给表单的数据的隐藏字段。还要确保您的评论视图模型具有此字段。
在表单中添加类似这样的内容
@Html.HiddenFor(m => m.PostID)
此外,您应该在其中定义PostID
字段评论的视图模型(DetailViewModel
)将从您的视图或表单操作传递到控制器。