solo side numeros net mvc framework dataannotations data create attribute asp anotaciones asp.net-mvc-4 asp.net-web-api data-annotations

asp.net-mvc-4 - side - dataannotations solo numeros



DataAnnotation para la propiedad requerida (4)

Primero funciona, ¡pero hoy falló!

Así es como defino la propiedad de fecha:

[Display(Name = "Date")] [Required(ErrorMessage = "Date of Submission is required.")] [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] [DataType(DataType.Date)] public DateTime TripDate { get; set; }

Ha estado trabajando en el pasado. Pero hoy, cuando llamo a la misma acción ApiController:

[HttpPost] public HttpResponseMessage SaveNewReport(TripLeaderReportInputModel model)

El Firebug informa:

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"

¿Que pasó? ¿No son esos [DataContract] para WCF ? ¡Estoy usando REST WebAPI en MVC4 !

¿Alguien puede ayudar? ¿Por favor?

---actualizar---

Hay algunos enlaces similares que he encontrado.

MvC 4.0 RTM nos rompió y no sabemos cómo solucionarlo RSS

--- actualizar de nuevo ---

Aquí está el encabezado de respuesta 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

Encabezado de solicitud:

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

--- actualización ---

He encontrado una solución improvisada. Ver la respuesta a continuación. Si alguien entiende por qué funciona o tiene mejores soluciones, publique sus respuestas. Gracias.


Bueno. Aunque no he completado, entiendo esto. Se encuentra una solución.

En Global.asax :

GlobalConfiguration.Configuration.Services.RemoveAll( typeof(System.Web.Http.Validation.ModelValidatorProvider), v => v is InvalidModelValidatorProvider);

Lo encontré en el Issue Tracker en aspnetwebstack. Aqui esta el enlace a la pagina:

Validación demasiado agresiva para aplicar [DataMember (IsRequired = true)] a las propiedades requeridas con tipos de valor

Si alguien puede decirnos por qué es así, publique sus ideas como respuestas. Gracias.


He agregado un ModelValidationFilterAttribute y lo ModelValidationFilterAttribute hecho funcionar:

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); } } }

Puede agregar el filtro [ModelValidation] en las acciones. O agréguelo a Global.asax.cs :

GlobalConfiguration.Configuration.Services.RemoveAll( typeof(System.Web.Http.Validation.ModelValidatorProvider), v => v is InvalidModelValidatorProvider);

De esta forma, sigo usando la anotación de datos original.

Referencia


Si intenta devolver el resultado de su acción como XML, necesitará usar DataContracts tal como lo requiere el serializador predeterminado. Supongo que anteriormente había estado solicitando el resultado de su acción como Json, el serializador Json no requiere contratos de datos. ¿Puedes publicar un violín de tu pedido?


ACTUALIZACIÓN 24-5-2013: InvalidModelValidatorProvider responsable de este mensaje de error se ha eliminado de la pila de tecnología ASP.NET. Este validador a prueba para causar más confusión de lo que se suponía que debía resolver. Para obtener más información, consulte el siguiente enlace: http://aspnetwebstack.codeplex.com/workitem/270

Cuando decora su clase con el atributo [DataContract] , necesita decorar explícitamente los miembros que desea serializar con el atributo [DataMember] .

El problema es que DataContractSerializer no admite el atributo [Required] . Para los tipos de referencia, podemos verificar que el valor no sea nulo después de la deserialización. Pero para los tipos de valor, no hay forma de que [DataMember(IsRequired=true)] semántica [Required] para DataContractSerializer sin [DataMember(IsRequired=true)] .

Por lo tanto, podría terminar marcando un DateTime como [Required] y esperar un error de validación del modelo si DateTime no se envía, pero obtendría un valor de DateTime.MinValue y no un error de validación.