简体   繁体   English

一些必需字段不适用于ViewModel MVC3

[英]Some Required fields not working on ViewModel MVC3

Controller Action: 控制器动作:

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

    }

Request Payload: 请求有效负载:

{"idCreditCard":1,"nameOnCard":"fdsa","billingAddress":"fdsa"}

Request Response: 请求回复:

["El Número es requerido","El Código de seguridad es requerido","El documento es requerido"]

As you can see, everything works perfectly except that int ExpirationMonth and int ExpirationYear should return a validation error (required) but they doesnt. 正如你所看到的,除了int ExpirationMonth和int ExpirationYear应该返回验证错误(必需)但它们没有。

Actually, modelstate have only 6 keys.... 实际上,modelstate只有6个键....

What can be causing this behaviour? 什么可能导致这种行为? I want to expirationMonth and expirationYear takes into consideration the [Required] DataAnnotation attribute. 我想expirationMonth和expirationYear考虑[Required] DataAnnotation属性。

Pretty sure is the same happening here: mvc model validation required not working on all fields 相当肯定是这里发生的事情: mvc模型验证不需要在所有字段上工作

EDIT: Reading the comments on that question see that the problem was the using, not my case tho. 编辑:阅读该问题的评论,看到问题是使用,而不是我的情况。 I included the using part. 我包括了使用部分。

This is probably because ExpirationMonth and ExpirationYear properties are integer values. 这可能是因为ExpirationMonthExpirationYear属性是整数值。 Integer is value type so it cannot be null, the default value will be 0 which is correct from the RequiredAttribute's point of view. Integer是值类型,因此它不能为null,默认值为0,从RequiredAttribute的角度来看是正确的。

What you can do is to change the type from int to int? 你能做的是将类型从int更改为int? so it can be null. 所以它可以为null。

See Nullable Types . 请参阅可空类型

Your viewmodel: 你的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() {

    }
}

Another approach is to make the validation more strict, from the names ExpirationMonth and ExpirationYear I think the RangeAttribute is appropriate for you. 另一种方法是使验证更严格,从名称ExpirationMonthExpirationYear我认为RangeAttribute适合您。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM