ModelState.IsValid = False



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));
}

最新更新