2012-01-31 34 views
6

Tôi có một int? xem thuộc tính mô hình được xác nhận ở phía máy khách như thể nó được yêu cầu. Đó là, nếu tôi để trống trường, nó sẽ không gửi. Điều này cũng không xảy ra đối với các thuộc tính chuỗi.Tại sao int của tôi? giá trị được xác nhận như thể nó được yêu cầu?

HTML render cho biên tập viên của tôi là:

<input type="text" value="" name="StatusIdSearch" id="StatusIdSearch" data-val-number="The field Status must be a number." data-val="true" class="text-box single-line"> 

Tôi tin rằng data-val-number đang gây ra một lỗi vì không có gì không phải là một con số, nhưng tôi không thể xác định lý do tại sao.

Bất kỳ ý tưởng nào?

Sửa

Quan điểm mô hình:

public class CompromissoSearchModel 
{ 
     // other properties removed for the sake of clarity 

     [Display(Name = "Status")] 
     [EnumDataType(typeof(StatusCompromisso))] 
     public int? StatusIdSearch { get; set; } 

     // other properties removed for the sake of clarity 
} 
+4

Hiển thị cho chúng tôi mô hình của bạn. –

+0

@SergioTapia: Cảm ơn bạn đã xem qua nó. Tôi đã cập nhật câu hỏi –

+1

Câu trả lời được đưa ra ở đây: http://stackoverflow.com/questions/4700172/unrequired-property-keeps-getting-data-val-required-attribute help? – hvd

Trả lời

1

Bạn sẽ có thể thêm đoạn mã sau vào phương pháp Application_Start của bạn trong tập tin Global.asax để khắc phục vấn đề này:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

+0

Cảm ơn bạn Scott nhưng điều này sẽ gây ra không có giá trị nullable loại để chấp nhận giá trị null từ khách hàng –

+0

tôi tìm thấy hành vi này cho các loại giá trị nullable truy cập trực quan. –

3

Thư bạn đang thấy không liên quan đến trường hợp bắt buộc validat ion. Bạn đang tìm kiếm điều này bởi vì ClientDataTypeModelValidatorProvider thêm xác thực số của ứng dụng khách và nó bỏ qua nếu loại đó có thể vô hiệu hóa hay không. Bạn có thể check the code yourself:

private static IEnumerable<ModelValidator> GetValidatorsImpl(
    ModelMetadata metadata, 
    ControllerContext context) 
{ 
    Type type = metadata.RealModelType; 
    if (IsNumericType(type)) { 
     yield return new NumericModelValidator(metadata, context); 
    } 
} 

IsNumericType thực hiện:

private static bool IsNumericType(Type type) 
{ 
    // strip off the Nullable<> 
    Type underlyingType = Nullable.GetUnderlyingType(type); 
    return _numericTypes.Contains(underlyingType ?? type); 
} 

Kể từ khi nullable không được xem là bạn luôn có được xác nhận đó. Về giải pháp, bạn cần phải loại bỏ ClientDataTypeModelValidatorProvider từ các nhà cung cấp được sử dụng hoặc có thể thay thế bằng một nhà cung cấp tùy chỉnh không bỏ qua không có giá trị.

+0

angelo: Tôi vẫn đang phân tích câu trả lời của bạn. Thật kỳ lạ vì tôi vừa mới tạo một dự án MVC mới và int? các thuộc tính không được xác nhận theo yêu cầu trong khi các thuộc tính [Bắt buộc] là. Có điều gì đó kỳ lạ với dự án đặc biệt này vì có vẻ như đó không phải là hành vi mong đợi. –

0

Tôi gặp sự cố tương tự và quản lý để tìm giải pháp. Không có giải pháp nào phù hợp với tôi vì vậy tôi nghĩ tôi sẽ đăng giải pháp của mình cho bất kỳ ai khác gặp sự cố này.

Vấn đề không phải là trình kết nối mô hình đã xác thực trường là không hợp lệ, nhưng khi sử dụng TryUpdateModel, thuộc tính có thể vô hiệu của viewmodel không thể vô hiệu hóa trong thực thể cơ sở dữ liệu.

giải thích rõ hơn:

TryUpdateModel(dbUser, "", new[]{ 
    "DecimalProperty" 
})); 

"DecimalProperty" trong viewmodel là nullable, nhưng nó đã không nullable trong dbuser.

Các vấn đề liên quan