本文介绍了复杂对象出现Razor页面验证错误,TryValiateModel()不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在构建.Net 5 Razor Pages Web App,并且有一个具有两个对象的结构:
public class Location
{
public Guid Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
[ForeignKey("Organization")]
public Guid OrganizationId { get; set; }
public Organization Organization { get; set; }
}
public class Organization
{
public Guid Id { get; set; }
[Required]
public string Name { get; set; }
}
以下是我的剃须刀页面中用于编辑位置对象的字段:
<input asp-for="Location.Organization.Id" class="hidden" value="@Model.Location.Organization.Id" />
<input asp-for="Location.Id" class="hidden" value="@Model.Location.Id" />
<input asp-for="Location.Name" class="form-control" value="@Model.Location.Name" />
我在页面上没有组织对象的字段。
在OnPost()方法中,我从数据库填充Organization对象,并再次尝试验证模型。
Location.Organization = await _db.Organizations.FindAsync(Location.Organization.Id);
if (!TryValidateModel(Location, nameof(Location)))
{
return Page();
}
但它不起作用。模型仍然无效(ModelState.IsValid != true
)
验证错误显示Organization.Name
应填写。
但Location对象中的所有字段都正确填充。填充组织对象后,Organization.Name
字段中也填充了非空字符串,应通过验证。
我与这个问题斗争了几个小时,并且已经尝试了其他方法,如TryValidateModel(Location.Organization)
等等。
我正在寻找一种不在表单中放置Organization.Name
字段的方法。因为在我的真实组织对象中还有更多其他字段,所以我不想将它们全部放在表单中。我也不想忽略验证错误。
我目前正在尝试了解TryValidateModel()
的工作原理,但从源代码中找出并不是很容易。
有什么办法解决这个问题吗?
推荐答案
您可以尝试在TryValidateModel(Location, nameof(Location))
之前添加ModelState.Clear
。以下是一个演示:
cshtml.cs:
[BindProperty]
public Location Location { get; set; }
public void OnGet()
{
Location = new Location { Id = Guid.NewGuid(), Name = "loc", Organization = new Organization { Id = Guid.NewGuid() } };
}
public IActionResult OnPost()
{
Location.Organization = new Organization { Id = Location.Organization.Id, Name = "org" };
ModelState.Clear();
if (!TryValidateModel(Location, nameof(Location)))
{
return Page();
}
else {
var s = ModelState.IsValid;
return Page();
}
}
结果:
这篇关于复杂对象出现Razor页面验证错误,TryValiateModel()不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!