在学习asp.net mvc的过程中,我遇到了一个问题,遇到了一些麻烦。
我试着创建一个简单的博客,只是为了测试我所学到的东西。但当涉及到编辑和离开一个领域时,我遇到了一个问题。
我正在尝试编辑我博客上已经提交的文章,该文章包含几个字段:id、headline、message、author和提交日期,这些字段不应编辑,只需保留原样即可。
下面是一些代码:
我的职位模型:

namespace MyBlock.Models
{
    public class Post
    {
        public int Id { get; set; }

        [Required]
        public string Author { get; set; }

        [Required]
        public string Headline { get; set; }

        [Required]
        public string Message { get; set; }

        public DateTime Date { get; set; }
    }
}

我的编辑:
[HttpGet]
public ActionResult Edit(int id = 0)
{
    Post post = db.Posts.Find(id);

    if (post != null) {
        return View(post);
    }

    return HttpNotFound();
}

[HttpPost]
public ActionResult Edit(Post post)
{
    if (ModelState.IsValid) {
        db.Entry(post).State = EntityState.Modified;
        db.SaveChanges();

        return RedirectToAction("Index", "Home");
    }

    return View(post);
}

以及我的编辑视图:
@model MyBlock.Models.Post

@{
    ViewBag.Title = "Edit";
}

<h2>Rediger "@Model.Headline"</h2>

@using (Html.BeginForm()) {
    @Html.LabelFor(u => u.Author)
    @Html.TextBoxFor(u => u.Author)

    @Html.LabelFor(u => u.Headline)
    @Html.TextBoxFor(u => u.Headline)

    @Html.LabelFor(u => u.Message)
    @Html.TextAreaFor(u => u.Message)

    <input type="submit" value="Gem" />
}

我知道我可以输入一个@HiddenFor(u => u.Date)并且提交相同的日期。但我敢打赌还有别的方法比把它作为源代码中的隐藏字段更有效吗?我的意思是这在另一个例子中不安全吗?所以我要的不是隐藏的领域。你们能帮我吗?
如果我试着按原样运行。我得到一个错误,这是我的日期没有设置,这是逻辑,因为它想更新一个以及。但我不想。如果你能这么说的话,我想任你选择。

最佳答案

不要从陌生人那里拿走糖果
换句话说,不要从客户端获取信息并直接更新数据库。您应该在服务器端强制执行业务规则,而不是信任客户端为您执行。

[HttpPost]
public ActionResult Edit(Post post)
{
    if (ModelState.IsValid) {
        var dbPost = db.Posts.FirstOrDefault(p => p.Id == post.Id);
        if (dbPost == null)
        {
            return HttpNotFound();
        }

        dbPost.Author = post.Author;
        dbPost.Message = post.Message;
        dbPost.Headline = post.Headline;
        db.SaveChanges();

        return RedirectToAction("Index", "Home");
    }

    return View(post);
}

[HttpPost]
public ActionResult Add(Post post)
{
    if (ModelState.IsValid) {
        var dbPost = db.Create<Post>();
        dbPost.Author = post.Author;
        dbPost.Message = post.Message;
        dbPost.Headline = post.Headline;
        dbPost.Date = DateTime.Now(); // Don't trust client to send current date
        db.SaveChanges();

        return RedirectToAction("Index", "Home");
    }

    return View(post);
}

在我自己的项目中,我在域层通过向ValidateEntity方法添加自定义验证规则来强制执行这样的规则。

09-21 00:06