在学习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
方法添加自定义验证规则来强制执行这样的规则。