__RequestVerificationToken输入的 Model防止重复 PostPost-Redirect-Get源码 __RequestVerificationTokenTag Helper 会在 内自动添加一个隐式的 input,用于防止 CSRF(跨站请求伪造)。 <form method="post"> ... <button type="submit" name="save">保存</button> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8MRDbUrpbqdIjRKQ1pLEGkphym9fk620w7Mnp-zhumPmrWEwDrk6cdR9q4Sju_AP_38Sp2ba-51KNWaRz2mXB-BXEegqNjwb8squcePSc3M43uiYnDrY8HzIumHvPCHoOOyGUHZwgShbYMZnOcz4jow" /></form> 可以通过 ValidateAntiForgeryToken 特性在后台对该 Token 进行验证: [HttpPost][ValidateAntiForgeryToken]public IActionResult Create(StudentCreateViewModel student){ ...} 输入的 Model Form导航到含有 Form 的 View 因为在 View 里面填写并提交的 Model 不包含的 Id 属性,所以如果 Create 方法使用 Student 类型作为 Model,MVC 框架会想尽办法在提交的信息里面找 Id 属性,进而导致出现意想不到的状况。 因此我们需要创建与 View 里面提交的 Model 属性一致的 Input Model。 StudentCreateViewModel: public class StudentCreateViewModel{ public string FirstName { get; set; } public string LastName { get; set; } public DateTime BirthDate { get; set; } public Gender Gender { get; set; }} ViewModel 的使用: [HttpPost]public IActionResult Create(StudentCreateViewModel student){ var newStudent = new Student { FirstName = student.FirstName, LastName = student.LastName, BirthDate = student.BirthDate, Gender = student.Gender }; var newModel = _repository.Add(newStudent); return View("Detail", newModel);} 防止重复 Post因为 Post 后地址依然是 /Home/Create,所以按下 F5 刷新网页,浏览器会重复提交信息。 Post-Redirect-Get通过 Post-Redirect-Get 模式重定向防止重复提交。 [HttpPost]public IActionResult Create(StudentCreateViewModel student){ var newStudent = new Student { FirstName = student.FirstName, LastName = student.LastName, BirthDate = student.BirthDate, Gender = student.Gender }; var newModel = _repository.Add(newStudent); return RedirectToAction(nameof(Detail), new { id = newModel.Id });} 效果: 源码Tutorial.zip