gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:56:29 25 4
gpt4 key购买 nike

我在Web API后操作中收到以下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中使用这些属性?

最佳答案

我面临与您相同的问题,我认为这完全是胡说。使用值类型,我可以看到[Required]不起作用,因为值类型的属性不能为null,但是当您拥有可为空的值类型时,应该不会有任何问题。但是,Web API模型验证逻辑似乎以相同的方式对待不可为null和可为null的值类型,因此您必须解决它。我在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; }
}

关于asp.net-mvc - Web API可为空的必需属性需要DataMember属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13633974/

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