ModelState
抛出一个错误,即参数[UserId]
之一为null
。这个字段没有在我的窗体上设置。它是在控制器中设置的。
如何将其从ModelState.IsValid测试中删除?
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,UserId,Created,TimeStamp,Name,Role,Description,Partner,PartnerAmount,Competitor,IsDeleted")] Relationship relationship)
{
relationship.UserId = User.Identity.Name.Replace(@"XXXXX","");
relationship.Created = DateTime.Now;
relationship.TimeStamp = DateTime.Now;
relationship.IsDeleted = false;
if (ModelState.IsValid)
{
_context.Add(relationship);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(relationship);
}
它不会通过UserId的ModelState.IsValid b/c。但是,它不会选中Created、Timestamp或IsDeleted。为什么它不检查这些,却检查UserId?所有这些字段在我的模型中都是必需的。
从视图模型中删除字段。如果没有,请在上创建。在视图中使用实体会产生安全漏洞,因为攻击者可能会设置发布后可能不会更改的字段。
使用视图模型可以确保浏览器中只有允许更改的字段可用。
如果仍要使用实体,请将UserId更改为int?
,这将告诉模型验证程序不必设置它。
您还可以删除验证ModelState["UserId"].Errors.Clear()
;但我强烈反对这样做。使用特定的视图模型。
您不能通过更改控制器内部的任何属性来更改ModelState.IsValid。IsValid仍然是相同的,因为错误列表将是相同的。应在模型到达控制器之前分配UserId。
因此,如果UserId可以为null,则将其赋值为0,并将此行添加到视图形式内部的某个位置
<input type="hidden" asp-for="@Model.UserId" value="@Model.UserId"/>
在控制器操作方法中,尝试使用Rerun验证,调用TryValidateModel方法,如下所示:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,UserId,Created,TimeStamp,Name,Role,Description,Partner,PartnerAmount,Competitor,IsDeleted")] Relationship relationship)
{
relationship.UserId = User.Identity.Name.Replace(@"XXXXX","");
relationship.Created = DateTime.Now;
relationship.TimeStamp = DateTime.Now;
relationship.IsDeleted = false;
if (!TryValidateModel(relationship, nameof(relationship)))
{
return View(relationship);
}
_context.Add(relationship);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}