ASP.NET MVC:编辑时忽略字段

ave*_*tic 4 .net c# asp.net asp.net-mvc asp.net-mvc-3

由于我正在学习ASP.NET MVC,我遇到了一个问题并遇到了一些麻烦

我正在尝试创建一个简单的博客,只是为了测试我到目前为止学到的东西.但是当谈到编辑和离开一个领域我遇到了问题.

我正在尝试在我的博客上编辑已经提交的帖子,该帖子包含几个字段:提交的标题,标题,消息,作者和日期,不应该被编辑,只是保持原样.

这是一些代码:

我的帖子模型:

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的编辑:

[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);
}
Run Code Online (Sandbox Code Playgroud)

我的编辑观点:

@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" />
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以投入,@HiddenFor(u => u.Date)并提交相同的日期.但我敢打赌除了将它作为源代码中的隐藏字段之外还有另一种方式吗?我的意思是在另一个例子中这不安全吗?所以我想要隐藏的字段而不是其他东西.你能帮助我吗?

如果我尝试按原样运行它.我收到的错误是我的日期没有设置,这是逻辑,因为它想要更新那个.但我不想要它.如果你能说的话,我想让它可选.

p.s*_*w.g 8

不要从陌生人那里拿糖果

换句话说,不要从客户端获取信息并直接更新数据库.您应该在服务器端强制执行业务规则,而不是信任客户端为您执行此操作.

[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);
}
Run Code Online (Sandbox Code Playgroud)

在我自己的项目中,我通过向ValidateEntity方法添加自定义验证规则在域层实施这样的规则.