Mvc4 RTM验证抛出错误

Div*_*Dan 5 validation restsharp asp.net-mvc-4

关于模型验证的rtm位有什么变化.

我有一个简单的viewmodel看起来像

    public class ProductViewModel
    { 
    [Required]
    [DataMember(IsRequired = true)]
    public int ProductTypeId { get; set; }
    public string Product { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

(我刚刚添加了DataMember(IsRequired = true)作为我得到的错误消息,用它来解决问题.但是没有快乐)

在我的控制器中,模型状态告诉我模型是有效的,但是当我尝试使用RestSharp将模型传递给我的api时,我得到以下错误.

{"消息":"发生了错误.","ExceptionMessage":"Mine.Model.Model"类型的"属性'ProductTypeId'无效.标记为[必需]的值类型属性也必须用[DataMember]标记(IsRequired = true)]被识别为必需.考虑将声明类型与[DataContract]和属性[DataMember(IsRequired = true)].","ExceptionType":"System.InvalidOperationException","StackTrace": "at System.Web.Http.Validation.Validators.ErrorModelValidator.Validate(ModelMetadata metadata,Object container)\ r \n在System.Web.Http.Validation.DefaultBodyModelValidator.ShallowValidate(ModelMetadata metadata,ValidationContext validationContext,Object container)\ r \n \n在System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata,ValidationContext validationContext,Object container)\ r \n在System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata,ValidationContext validationContext)\ r \n \n在System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata,ValidationContext validationContext,Object container)\ r \n在System.Web.Http.Validation.DefaultBodyModelValidator.Validate(对象模型,Type类型,ModelMetadataProvider metadataProvider, HttpActionContext actionContext,String keyPrefix)\ r \n在System.Web.Http.ModelBinding.FormatterParameterBinding.<> c_ DisplayClass1.b _0(对象模型)\ r \n在System.Threading.Tasks.TaskHelpersExtensions.<> c__DisplayClass36 1.<>c__DisplayClass38.<Then>b__35()\r\n at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass49.<ToAsyncVoidTask>b__48()\r\n at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func1 func ,CancellationToken cancellationToken)"}

我没有使用rc位这个问题,但后来我才开始使用带有rtm位的restsharp库.

任何帮助都会很棒.

Sha*_*ser 3

除了将 [DataMember(IsRequired = true)] 添加到属性之外,您还需要确保在类级别应用属性 [DataContract]。

  • 不幸的是,一旦添加 [DataContract],您就需要将 [DataMember] 放在要序列化的每个字段上。我在这里遇到了同样的问题 - 必须修改我的所有实体。如果保留“DataContract”,.NET 将使用公开可见的类型来推断数据协定。一旦将 DataContract 放在类上,您就告诉 .NET 您想要自定义序列化。您需要将 DataMember 放在要序列化的每个值上,然后通过 DataMember 属性上的属性进行自定义 - 即/ IsRequired (3认同)