Visual
__RequestVerificationToken
Tag Helper 会在
<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 });
}
效果: