复杂对象出现Razor页面验证错误,TryValiateModel()不起作用 [英] Razor Page validation error with a complex object, TryValidateModel() does not work

查看:17
本文介绍了复杂对象出现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()不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆