DataAnnotation为必需属性
首先它有效,但今天它失败了!
这是我如何定义date属性:
[Display(Name = "Date")] [Required(ErrorMessage = "Date of Submission is required.")] [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] [DataType(DataType.Date)] public DateTime TripDate { get; set; }
它一直在工作。 但今天,当我调用相同的ApiController行动:
[HttpPost] public HttpResponseMessage SaveNewReport(TripLeaderReportInputModel model)
Firebug报道:
ExceptionMessage: "Property 'TripDate' on type 'Whitewater.ViewModels.Report.TripLeaderReportInputModel' 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)]." ExceptionType "System.InvalidOperationException"
发生了什么? WCF
[DataContract]
不是那些吗? 我正在使用REST WebAPI
中的REST WebAPI
MVC4
!
谁能帮忙? 请?
—更新—
我find了一些类似的链接。
MvC 4.0 RTM打破了我们,我们不知道如何解决它的RSS
—再次更新—
这里是HTTP响应头:
Cache-Control no-cache Connection Close Content-Length 1846 Content-Type application/json; charset=utf-8 Date Thu, 06 Sep 2012 17:48:15 GMT Expires -1 Pragma no-cache Server ASP.NET Development Server/10.0.0.0 X-AspNet-Version 4.0.30319
请求标题:
Accept */* Accept-Encoding gzip, deflate Accept-Language en-us,en;q=0.5 Cache-Control no-cache Connection keep-alive Content-Length 380 Content-Type application/x-www-form-urlencoded; charset=UTF-8 Cookie .ASPXAUTH=1FF35BD017B199BE629A2408B2A3DFCD4625F9E75D0C58BBD0D128D18FFDB8DA3CDCB484C80176A74C79BB001A20201C6FB9B566FEE09B1CF1D8EA128A67FCA6ABCE53BB7D80B634A407F9CE2BE436BDE3DCDC2C3E33AAA2B4670A0F04DAD13A57A7ABF600FA80C417B67C53BE3F4D0EACE5EB125BD832037E392D4ED4242CF6 DNT 1 Host localhost:39019 Pragma no-cache Referer http://localhost:39019/Report/TripLeader User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0 X-Requested-With XMLHttpRequest
—更新—
我发现了一个临时解决scheme。 见下面的答案。 如果有人知道它为什么有效或有更好的解决scheme,请发表您的答案。 谢谢。
好的。 虽然我还没有完全理解这个东西。 find解决方法。
在Global.asax
:
GlobalConfiguration.Configuration.Services.RemoveAll( typeof(System.Web.Http.Validation.ModelValidatorProvider), v => v is InvalidModelValidatorProvider);
我在aspnetwebstack的问题跟踪器中find它。 这是链接到页面:
将[DataMember(IsRequired = true)]应用于具有值types的所需属性过于积极的validation
如果有人能告诉我们为什么这样,请发表您的见解作为答案。 谢谢。
我已经添加了一个ModelValidationFilterAttribute
,并使其工作:
public class ModelValidationFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { if (!actionContext.ModelState.IsValid) { // Return the validation errors in the response body. var errors = new Dictionary<string, IEnumerable<string>>(); //string key; foreach (KeyValuePair<string, ModelState> keyValue in actionContext.ModelState) { //key = keyValue.Key.Substring(keyValue.Key.IndexOf('.') + 1); errors[keyValue.Key] = keyValue.Value.Errors.Select(e => e.ErrorMessage); } //var errors = actionContext.ModelState // .Where(e => e.Value.Errors.Count > 0) // .Select(e => new Error // { // Name = e.Key, // Message = e.Value.Errors.First().ErrorMessage // }).ToArray(); actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, errors); } } }
您可以在操作上添加[ModelValidation]
filter。 或者将其添加到Global.asax.cs
:
GlobalConfiguration.Configuration.Services.RemoveAll( typeof(System.Web.Http.Validation.ModelValidatorProvider), v => v is InvalidModelValidatorProvider);
这样,我继续使用原始数据注释。
参考
更新 InvalidModelValidatorProvider
负责此错误消息的InvalidModelValidatorProvider
已从 ASP.NET技术堆栈中删除 。 这个validation者证实会导致比想要解决的更多的困惑。 有关更多信息,请参阅以下链接: http : //aspnetwebstack.codeplex.com/workitem/270
当使用[DataContract]
属性装饰类时,需要使用[DataMember]
属性显式装饰要序列化的成员。
问题是DataContractSerializer
不支持[Required]
属性。 对于引用types,我们可以在反序列化之后检查该值是否为空。 但是对于值types,我们无法在没有[DataMember(IsRequired=true)]
情况下强制执行DataContractSerializer
的[Required]
语义。
所以你可能最终将DateTime
标记为[Required]
并且如果DateTime
没有被发送,那么期望模型validation错误,但是你只需要得到一个DateTime.MinValue
值,而不是validation错误。
如果您试图将操作的输出作为XML返回,那么您将需要使用DataContracts,因为它们是默认序列化程序所需的。 我猜你以前一直要求你的动作输出为Json,Json序列化器不需要数据契约。 你可以张贴你的请求小提琴吗?
- ASP.Net中的远程validationMVC 3:如何在Action Method中使用AdditionalFields
- 如何使用范围数据注释属性指定最小但不是最大小数?
- 从数据注释的Asp.Net Mvc隐藏字段
- 如何在ASP.MVC中指定多行编辑器的列和行?
- 如何创build自定义数据注释validation器
- DataAnnotationsvalidation(正则expression式)在asp.net mvc 4 – 剃刀视图
- 使用AngularJS的ASP.NET MVCvalidation表单
- 使用WPF和entity framework的DataAnnotationsvalidation数据?
- 以强types的方式获取属性的属性