设置Get和Post的值

时间:2013-12-19 22:17:09

标签: c# asp.net-mvc view model http-post

我正在开发一个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,对象属性就在那里......

1 个答案:

答案 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操作控制。你永远不应该发布类似于所有者的东西,因为任何帖子值都可以被操纵,允许恶意用户将对象与他们喜欢的任何东西相关联。