我正在开发一个MVC C#应用程序。
这是我的代码:
//
// GET: /Comment/Create
[Authorize]
public ActionResult Create(int bookid = 0)
{
var comment = new Comment();
comment.Book = _bookService.GetBookFromBookId(bookid);
comment.Owner = _userService.GetLoggedInUser();
return View(comment);
}
//
// POST: /Comment/Create
[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public ActionResult Create(Comment comment)
{
if (ModelState.IsValid)
{
db.Comments.Add(comment);
db.SaveChanges();
return RedirectToAction("Index","Book",null);
}
return View(comment);
}
在Get Create ActionResult中,为Comment对象设置了Book和Owner值,但是,在HttpPost Create ActionResult中,值不在对象中。
如何让这段代码正常运行?
更新
这是我的观看代码:
@model LearningTestMVCApplication.Models.Comment
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Comment</legend>
<p>
Book Name: @Html.DisplayFor(model => model.Book.Name)
</p>
<div class="editor-label">
@Html.LabelFor(model => model.DisplayText)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.DisplayText)
@Html.ValidationMessageFor(model => model.DisplayText)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
我调试了View,对象属性就在那里......
答案 0 :(得分:0)
在您的POST操作中,存在的对象的唯一部分是实际以字段形式表示的数据。如果您没有为图书和用户提供字段(隐藏或其他字段),那么它们将不在您的帖子中,您的模型将不会有这些对象。
然而,在这种情况下,你不会想要这样做。你不允许他们改变这些信息;你只是在创造联想。所以你应该拥有的是:
// GET: /Comment/Create
[Authorize]
public ActionResult Create(int bookid)
{
var comment = new Comment();
return View(comment);
}
//
// POST: /Comment/Create
[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public ActionResult Create(int bookid, Comment comment)
{
comment.Book = _bookService.GetBookFromBookId(bookid);
comment.Owner = _userService.GetLoggedInUser();
if (ModelState.IsValid)
{
db.Comments.Add(comment);
db.SaveChanges();
return RedirectToAction("Index","Book",null);
}
return View(comment);
}
看到区别?您的POST操作也应该使用book id,它将使用它来查找正确的书以与其余的对象数据一起保存。现在,GET操作仅使用book id来标识要发布到的URL。 (您现在可以执行@Html.BeginForm()
而无需传递任何路由参数,只需将其回发到同一个URL。)您可能仍希望在GET操作中查找该书,但这仅用于视图中的显示目的;它实际上不会影响发送回POST操作的数据。
用户信息始终由POST操作控制。你永远不应该发布类似于所有者的东西,因为任何帖子值都可以被操纵,允许恶意用户将对象与他们喜欢的任何东西相关联。