1

コントローラのアクション:

 [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モデルの検証はすべてのフィールドで機能する必要はありません

編集:その質問のコメントを読むと、問題は私の場合ではなく、使用にあることがわかります。使用部分を含めました。

4

1 に答える 1

3

これはおそらくExpirationMonthExpirationYearプロパティが整数値であるためです。整数は値型であるため、nullにすることはできません。デフォルト値は0であり、RequiredAttributeの観点からは正しい値です。

できることは、タイプをからに変更して、intnullint?にすることです。

Nullable型を参照してください。

あなたのビューモデル:

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() {

    }
}

もう1つのアプローチは、名前から検証をより厳密にすることです。RangeAttribute が適切だExpirationMonthExpirationYear思います。

于 2012-10-16T15:39:54.623 に答える