asp.net-mvc – Web API可空的必需属性需要DataMember属性

我在Web API Post操作中收到以下VM
public class ViewModel
{
    public string Name { get; set; }

    [Required]
    public int? Street { get; set; }
}

当我发帖时,我会收到以下错误:

Property ‘Street’ on type ‘ViewModel’ is invalid. Value-typed properties marked as [Required] must also be marked with [DataMember(IsRequired=true)] to be recognized as required. Consider attributing the declaring type with [DataContract] and the property with [DataMember(IsRequired=true)].

似乎错误是清楚的,所以我只是想要完全确定需要使用[DataContract]和[DataMember]属性,当你有一个需要可空属性的类。

有没有办法避免在Web API中使用这些属性?

解决方法

我正在面对同样的问题,我认为这是完整的废话。使用值类型,我可以看到[必需]不起作用,因为值类型的属性不能为空,但是当您具有可空值类型时,不应该有任何问题。然而,Web API模型验证逻辑似乎以相同的方式处理非可空和可空值类型,因此您必须解决它。我在 Web API forum中找到了一个解决方案,可以确认它的工作原理:创建一个ValidationAttribute子类,并将其替换为对可空值类型属性的RequiredAttribute:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

public class NullableRequiredAttribute : ValidationAttribute,IClientValidatable
{
    public bool AllowEmptyStrings { get; set; }

    public NullableRequiredAttribute()
        : base("The {0} field is required.")
    {
        AllowEmptyStrings = false;
    }

    public override bool IsValid(object value)
    {
        if (value == null)
            return false;

        if (value is string && !this.AllowEmptyStrings)
        {
            return !string.IsNullOrWhiteSpace(value as string);
        }

        return true;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata,ControllerContext context)
    {
        var modelClientValidationRule = new ModelClientValidationRequiredRule(FormatErrorMessage(metadata.DisplayName));
        yield return modelClientValidationRule;
    }
}

NullableRequiredAttribute正在使用中:

public class Model
{
    [NullableRequired]
    public int? Id { get; set; }
}

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....