【问题标题】:Interface property model not validating接口属性模型未验证
【发布时间】:2018-11-25 12:49:49
【问题描述】:

我有一个包含各种子对象的类:

public class ApplicationPayload
{
    public Quote Quote { get; set; }    
    public IApplication Application { get; set; }
    public DeliveryPreferences DeliveryPreferences { get; set; }
}

我有一个接受这个模型的 api 控制器方法:

public async Task<IActionResult> LtdCompanyPost([FromBody] ApplicationPayload payload)
{
}

当提交给控制器方法时,实现 IApplication 的类中的属性没有被验证(验证似乎被忽略了),但是,其他对象(Quote / DeliveryPreferences)正在按预期进行验证。

是否可以让我的对象实现 IApplication 可验证,或者这种结构根本不适合我?

(我测试了实现 IApplication 的对象,将它们置于与 Quote/DeliveryPreferences 相同的级别,删除了接口实现,并且验证按预期工作,因此验证规则本身不是问题)。

有什么建议吗?如有必要,我可以举出更多的例子。

【问题讨论】:

    标签: c# .net validation asp.net-web-api interface


    【解决方案1】:

    我的猜测是你在ComplexModelBinder 中遇到了以下检查,接口没有构造函数。

    但更广泛地说,它如何知道要实例化接口的哪个实现?

     if (modelTypeInfo.IsAbstract || modelTypeInfo.GetConstructor(Type.EmptyTypes) == null)
     {
        var metadata = bindingContext.ModelMetadata;
        switch (metadata.MetadataKind)
        {
            case ModelMetadataKind.Parameter:
                throw new InvalidOperationException(
                    Resources.FormatComplexTypeModelBinder_NoParameterlessConstructor_ForParameter(
                        modelTypeInfo.FullName,
                        metadata.ParameterName));
            case ModelMetadataKind.Property:
                throw new InvalidOperationException(
                    Resources.FormatComplexTypeModelBinder_NoParameterlessConstructor_ForProperty(
                        modelTypeInfo.FullName,
                        metadata.PropertyName,
                        bindingContext.ModelMetadata.ContainerType.FullName));
            case ModelMetadataKind.Type:
                throw new InvalidOperationException(
                    Resources.FormatComplexTypeModelBinder_NoParameterlessConstructor_ForType(
                        modelTypeInfo.FullName));
        }
    }
    

    https://github.com/aspnet/Mvc/blob/24eaa740f5b1736700d8d91053f60d690f4fc17e/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Binders/ComplexTypeModelBinder.cs#L366,

    【讨论】:

    • 嗨@Bryan,同意,这听起来像是正在发生的事情。至于它会知道,我想它不会。我承认,这不是我的代码,一旦我们发现验证在一些重构后不再起作用,我就选择了它。我想除了转换/映射到一个类型然后再次调用验证之外,没有简单的方法可以解决这个问题?请原谅这里的无知..我正在深入了解这个项目lol
    • 我建议用具体类型替换模型中的接口。如果接口的实现只有一种,他们的回答很简单,如果有更多,你将不得不选择一个。
    猜你喜欢
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多