【问题标题】:Mvc4 RTM validation throwing an errorMvc4 RTM 验证抛出错误
【发布时间】:2012-09-02 08:49:35
【问题描述】:

关于模型验证的 rtm 位发生了一些变化。

我有一个简单的视图模型,看起来像

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

(我刚刚添加了 DataMember(IsRequired = true) 作为我收到的错误消息说使用它来解决问题。但是没有乐趣)

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

{"Message":"发生错误。","ExceptionMessage":"类型 'Mine.Model.Model' 上的属性 'ProductTypeId' 无效。标记为 [Required] 的值类型属性也必须标记将 [DataMember(IsRequired=true)] 识别为必需。考虑使用 [DataContract] 和属性使用 [DataMember(IsRequired=true)] 来分配声明类型。","ExceptionType":"System.InvalidOperationException"," StackTrace":" 在 System.Web.Http.Validation.Validators.ErrorModelValidator.Validate(ModelMetadata metadata, Object container)\r\n at System.Web.Http.Validation.DefaultBodyModelValidator.ShallowValidate(ModelMetadata metadata, ValidationContext validationContext, Object container) )\r\n 在 System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata 元数据,ValidationContext 验证上下文,对象容器)\r\n 在 System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata 元数据,ValidationContext 验证nContext)\r\n 在 System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata 元数据,ValidationContext 验证上下文,对象容器)\r\n 在 System.Web.Http.Validation.DefaultBodyModelValidator.Validate(对象模型,类型类型, ModelMetadataProvider metadataProvider, HttpActionContext actionContext, String keyPrefix)\r\n 在 System.Web.Http.ModelBinding.FormatterParameterBinding.c_DisplayClass1.b_0(Object model)\r\n 在 System. Threading.Tasks.TaskHelpersExtensions.c__DisplayClass361.<>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 cancelToken)"}

我在 rc 位上没有遇到这个问题,但后来我才开始使用带有 rtm 位的 restsharp 库。

任何帮助都会很棒。

【问题讨论】:

  • 我遇到了完全相同的问题。

标签: validation asp.net-mvc-4 restsharp


【解决方案1】:

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

【讨论】:

  • 我的 UI mvc 项目和 WebApi 项目都使用了一个模型类。那么添加 [DataContract] 不会造成任何问题?
  • 我不这么认为。 DataContract 影响序列化,而不是 MVC 模型绑定。
  • 添加 DataContract 让我进入 api 中的控制器,但是所有参数都没有发送。我需要添加其他内容吗?
  • 不幸的是,添加 [DataContract] 后,您需要将 [DataMember] 放在要序列化的每个字段上。我在这里遇到了同样的问题 - 必须修改我的所有实体。如果“DataContract”被忽略,.NET 将使用公开可见的类型推断数据合同。一旦你把 DataContract 放在一个类上,你就是在告诉 .NET 你想要自定义序列化。您需要将DataMember放在您想要序列化的每个值上,然后通过DataMember属性上的属性进行自定义 - 即/ IsRequired
【解决方案2】:

UI 正在使用数据条目 DataContract 来创建数据条目表单和表单发布时的后端。那么,是否可以肯定地说后端需要 [DataMember(IsRequired = true)] 并且表单验证需要 [Required(ErrorMessage = @"Product type is required)] 以便您可以访问错误消息?

我不确定为什么我们必须同时做这两件事。为什么前端和服务器端不能使用一个属性?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2014-08-21
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多