我偶然发现了一种更好的方法,可以在帖子窗口中使用<p id="createPostButton">@Html.Action("Create", "Comment", new { id = Model.PostId })</p>
显示我的评论表单(我原本只是想创建一个按钮,将您带到发送帖子ID的评论页面)。但是,当我尝试传回CommentController中的post / details / {id}视图时,我现在收到错误。它不断尝试查看评论或共享文件夹,通过帖子或详细信息/ {id}而非帖子/详细信息/ {id}。
发布/详细信息Razor HTML文件:
@model FantaC.Models.Post
@{
ViewBag.Title = @Html.DisplayFor(model => model.PostName);
}
<h2>@Html.DisplayFor(model => model.PostName)</h2>
<div class="row">
<div class="col-md-8 whiteBorder scroll">
<div class="postName">
<h4>Written by: @Html.DisplayFor(model => model.UserName)</h4>
<img src="@Html.DisplayFor(model => model.PostImage)" />
</div>
<div class="postContent">
<p>@Html.DisplayFor(model => model.PostContent)</p>
</div>
</div>
<div class="col-md-4 whiteBorder scroll">
<h4>Comments</h4>
@foreach (var comment in Model.PostComments)
{
<h5>@Html.DisplayFor(modelItem => comment.UserName)</h5>
<h5>@Html.DisplayFor(modelItem => comment.CommentSubject)</h5>
<p>@Html.DisplayFor(modelItem => comment.CommentContent)</p>
<p>
@Html.ActionLink("Edit", "../Comment/Edit", new { id = comment.CommentId }) |
@Html.ActionLink("Details", "../Comment/Details", new { id = comment.CommentId }) |
@Html.ActionLink("Delete", "../Comment/Delete", new { id = comment.CommentId })
</p>
}
<p id="createPostButton">@Html.Action("Create", "Comment", new { id = Model.PostId })</p> <!--**********This is the line that is important-->
@*@=Html.RenderAction("Create", "Comments", new { postId = Model.PostId });*@
@*@Html.Partial("Comments")*@
</div>
</div>
<p>
@*@Html.ActionLink("Add a Comment", "Create", "Comment")*@
@Html.ActionLink("Comment", "Create", "Comment", new { id = Model.PostId }, null) |
@Html.ActionLink("Back to List", "Index")
由Html.Action提取的评论/创建Razor HTML文件:
@model FantaC.Models.Comment
@{
Layout = null;
}
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Comment</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.CommentSubject, htmlAttributes: new { @class = "control-label col-md-10 displayBlock" })
<div class="col-md-12">
@Html.EditorFor(model => model.CommentSubject, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.CommentSubject, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.CommentContent, htmlAttributes: new { @class = "control-label col-md-10 displayBlock" })
<div class="col-md-12">
@Html.EditorFor(model => model.CommentContent, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.CommentContent, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
@*<div>
@Html.ActionLink("Back to List", "Index")
</div>*@
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
CommentController的重要部分:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(string id, [Bind(Include = "CommentSubject,CommentContent")] Comment model)
{
if (ModelState.IsValid)
{
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
var commentId = (23817 + db.Comment.Count()).ToString().PadLeft(10, '0');
var comment = new Comment
{
CommentId = commentId,
PostId = id,
UserName = user.UserName,
PostTime = DateTime.Now,
CommentSubject = model.CommentSubject,
CommentContent = model.CommentContent
};
db.Comment.Add(comment);
db.SaveChanges();
return View("Details/" + id, "Post");
}
return View(model);
}
我也试过return View("../post/details/" + id);
无济于事。如何从评论控件中回到帖子视图网址(post / details / {id}?
作为旁注,我通过取出返回并制作方法void
几乎完成了工作,但在点击提交注释按钮后,整个注释/创建表单将消失。如果有人知道在点击创建评论按钮后让表格保持不变的话,我会回到那种做事的方式。
感谢您的帮助! :)
编辑:
我忘了提到我也试过这个。它返回一个如下所示的错误:
描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.InvalidOperationException:不允许子操作执行重定向操作。
来源错误:
第32行:} 第33行: 第34行:@ Html.Action(“创建”,“评论”,新{id = Model.PostId})
第35行:
答案 0 :(得分:2)
您应该遵循 PRG ( POST-REDIRECT-GET )模式。保存评论后,您应该重定向到帖子详细信息页面。
您可以使用RedirectToAction
方法将RedirectResponse返回给浏览器,该浏览器将对帖子详细信息操作方法发出新的GET请求。
所以替换
return View("Details/" + id, "Post");
带
return RedirectToAction("Details" , "Post", new {id=id});