控制器操作:
[AjaxRequestOnly, HttpPost, Authorize]
public ActionResult AddCreditCard(CustomerCreditCardModelView cc) {
if (!ModelState.IsValid) {
Response.StatusCode = 400;
return Content(Newtonsoft.Json.JsonConvert.SerializeObject(ModelState.Values.SelectMany(v => v.Errors).Select(e=>e.ErrorMessage)));
}
// .... do something ...
}
模型视图:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using CheckoutVC.CheckoutServiceReference;
using Newtonsoft.Json;
public class CustomerCreditCardModelView {
[Display(Name = "Número")]
[Required(ErrorMessage = "El Número es requerido")]
[StringLength(20, MinimumLength = 12, ErrorMessage = "El número parece ser incorrecto")]
[JsonIgnore, ScriptIgnore]
public string CardNumber { get; set; }
[Display(Name = "Código de seguridad")]
[Required(ErrorMessage = "El Código de seguridad es requerido")]
public string CardSecurityCode { get; set; }
[Display(Name = "Nombre en la tarjeta")]
[Required(ErrorMessage = "El Nombre en la tarjeta es requerido")]
public string NameOnCard { get; set; }
[Display(Name = "Dirección de cobro")]
[Required(ErrorMessage = "La Dirección de cobro es requerida")]
public string BillingAddress { get; set; }
[Display(Name = "Mes de vencimiento")]
[Required(ErrorMessage = "El Mes de vencimiento es requerido")]
public int ExpirationMonth { get; set; }
[Display(Name = "Año de vencimiento")]
[Required(ErrorMessage = "El Año de vencimiento es requerido")]
public int ExpirationYear { get; set; }
[Display(Name = "Documento")]
[Required(ErrorMessage = "El documento es requerido")]
public string Document { get; set; }
[Display(Name = "Tipo de tarjeta")]
public int IdCreditCard { get; set; }
public int IdCustomer { get; set; }
public bool IsDeleted { get; set; }
public int IdCustomerCreditCard { get; set; }
public CustomerCreditCardModelView() {
}
请求有效负载:
{"idCreditCard":1,"nameOnCard":"fdsa","billingAddress":"fdsa"}
请求回复:
["El Número es requerido","El Código de seguridad es requerido","El documento es requerido"]
正如你所看到的,除了int ExpirationMonth和int ExpirationYear应该返回验证错误(必需)但是它们没有。
实际上,modelstate只有6个键......
导致此行为的原因是什么?我想expirationMonth和expirationYear考虑[Required] DataAnnotation属性。
非常肯定在这里也是如此:mvc model validation required not working on all fields
编辑:阅读有关该问题的评论,看到问题是使用,而不是我的案例。我包括了使用部分。
答案 0 :(得分:3)
这可能是因为ExpirationMonth
和ExpirationYear
属性是整数值。 Integer是值类型,因此它不能为null,默认值为0,从RequiredAttribute的角度来看是正确的。
您可以做的是将类型从int
更改为int?
,以便它可以为空。
请参阅Nullable Types。
您的viewmodel:
public class CustomerCreditCardModelView {
[Display(Name = "Número")]
[Required(ErrorMessage = "El Número es requerido")]
[StringLength(20, MinimumLength = 12, ErrorMessage = "El número parece ser incorrecto")]
[JsonIgnore, ScriptIgnore]
public string CardNumber { get; set; }
[Display(Name = "Código de seguridad")]
[Required(ErrorMessage = "El Código de seguridad es requerido")]
public string CardSecurityCode { get; set; }
[Display(Name = "Nombre en la tarjeta")]
[Required(ErrorMessage = "El Nombre en la tarjeta es requerido")]
public string NameOnCard { get; set; }
[Display(Name = "Dirección de cobro")]
[Required(ErrorMessage = "La Dirección de cobro es requerida")]
public string BillingAddress { get; set; }
[Display(Name = "Mes de vencimiento")]
[Required(ErrorMessage = "El Mes de vencimiento es requerido")]
public int? ExpirationMonth { get; set; }
[Display(Name = "Año de vencimiento")]
[Required(ErrorMessage = "El Año de vencimiento es requerido")]
public int? ExpirationYear { get; set; }
[Display(Name = "Documento")]
[Required(ErrorMessage = "El documento es requerido")]
public string Document { get; set; }
[Display(Name = "Tipo de tarjeta")]
public int IdCreditCard { get; set; }
public int IdCustomer { get; set; }
public bool IsDeleted { get; set; }
public int IdCustomerCreditCard { get; set; }
public CustomerCreditCardModelView() {
}
}
另一种方法是通过名称ExpirationMonth
和ExpirationYear
使验证更加严格我认为RangeAttribute适合您。