コントローラのアクション:
[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 ...
}
ModelView:
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とintExpirationYearが検証エラー(必須)を返す必要があることを除いて、すべてが完全に機能しますが、そうではありません。
実際、modelstateには6つのキーしかありません。
この動作の原因は何ですか?ExpirationMonthを使用したいのですが、expirationYearは[必須]DataAnnotation属性を考慮に入れています。
ここでも同じことが起こっていることは確かです:MVCモデルの検証はすべてのフィールドで機能する必要はありません
編集:その質問のコメントを読むと、問題は私の場合ではなく、使用にあることがわかります。使用部分を含めました。