gpt4 book ai didi

c# - 当模型是子模型的集合时验证表单

转载 作者:行者123 更新时间:2023-11-30 12:41:49 25 4
gpt4 key购买 nike

我有一个 View 需要多个模型才能正常工作。因此,我创建了一个模型,它是多个(子)模型的集合。这是模型。

public class PolicyDetail
{
public Policy Policy { get; set; }
public IEnumerable<Insured> Insureds { get; set; }
public IEnumerable<Risk> Risks { get; set; }
public IEnumerable<Construction> Constructions { get; set; }
}

下面是其中一个子模型的示例,它是数据库中的实际实体:

public class Policy
{
[Key]
public int PolicyID { get; set; }

[DisplayName("Policy Number")]
public Guid PolicyNumber { get; set; }

[Required(ErrorMessage = "Please enter a valid Effective Date.")]
[DataType(DataType.DateTime)]
[DisplayName("Effective Date")]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
public DateTime EffDate { get; set; }

[Required(ErrorMessage = "Please enter a valid Expiration Date.")]
[DataType(DataType.DateTime)]
[DisplayName("Expiration Date")]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
public DateTime ExpDate { get; set; }

public Boolean IsActive { get; set; }
}

这一切都运行良好,直到我尝试提交一个有错误的表单来测试验证。我早该预见到这一点(也许?),但因为实际模型上没有任何验证标签,所以它总是通过 if (ModelState.IsValid) 检查。有什么方法可以强制或继承子类的所有数据注释吗?

或者,我使用的模型是其他模型的集合,这一切都错了吗?问题是,我希望能够从同一 View 编辑/添加多个数据库实体。

编辑:

This article Josh Carroll 的作品看起来正是我所需要的。但是当我实现它时,我得到一个 Null Object 错误。这是我正在做的:

public class PolicyDetail
{
[Required, ValidateObject]
public Policy Policy { get; set; }
public IEnumerable<Insured> Insureds { get; set; }
public IEnumerable<Risk> Risks { get; set; }
public IEnumerable<Construction> Constructions { get; set; }
}

然后在他提供的override方法中:

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var results = new List<ValidationResult>();
var context = new ValidationContext(value, null, null);

Validator.TryValidateObject(value, context, results, true);

if (results.Count != 0)
{
var compositeResults = new CompositeValidationResult(String.Format("Validation for {0} failed!", validationContext.DisplayName));
results.ForEach(compositeResults.AddResult);

return compositeResults;
}

return ValidationResult.Success;
}
}

参数“value”为空,因此在这一行出错:

Validator.TryValidateObject(value, context, results, true);

我错过了什么吗?做错了什么?

最佳答案

您可以使用以下命令手动调用子模型的验证:https://msdn.microsoft.com/en-us/library/dd411772.aspx

var context = new ValidationContext(model.Policy, serviceProvider: null, items: null);
var validationResults = new List<ValidationResult>();

bool isValid = Validator.TryValidateObject(model.Policy, context, validationResults, true);

然后您可以使用 ModelState.AddModelError 从中构建响应。

绝对不是最优雅的解决方案,但可能比重写现有内容更容易。

关于c# - 当模型是子模型的集合时验证表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36222495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com