复杂对象出现Razor页面验证错误,TryValiateModel()不起作用

Razor Page validation error with a complex object, TryValidateModel() does not work(复杂对象出现Razor页面验证错误,TryValiateModel()不起作用)
本文介绍了复杂对象出现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()不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)