2011-09-07 38 views
6

Làm cách nào để bạn tạo các thuộc tính bắt buộc có điều kiện với khung MVC 3 sẽ làm việc với Xác thực phía máy khách cũng như Xác thực phía máy chủ khi JS bị tắt? Ví dụ:MVC 3 Các thuộc tính bắt buộc có tính chất

public class PersonModel 
{ 
    [Required] // Requried if Location is not set 
    public string Name {get; set;} 
    [Range(1, 5)] // Requried if Location is not set 
    public int Age {get; set;} 

    [Required] // Only required if Name and Age are not set. 
    public string Location {get; set;} 
} 

Các quy tắc trong ví dụ này là:

  1. NameAge được yêu cầu nếu Location không được thiết lập.
  2. Location chỉ bắt buộc nếu NameAge không được đặt.
  3. Không quan trọng nếu Tên, Tuổi và Vị trí đều được đặt.

Trong chế độ xem, tôi cần kết quả được gửi đến Action nếu tên/độ tuổi được đặt. Và một Action khác nếu Vị trí được đặt. Tôi đã thử với 2 hình thức riêng biệt với Get Url khác nhau; điều này làm việc tuyệt vời ngoại trừ các quy tắc xác nhận đang gây ra sự cố. Ưu tiên sử dụng, tôi muốn sử dụng 2 hành động Nhận riêng Url của, ví dụ,

@model PersonModel 

@using(Html.BeginForm("Age", "Person", FormMethod.Post)) 
{ 
    @Html.TextBoxFor(x => x.Name) 
    @Html.ValidationMessageFor(x => x.Name) 
    @Html.TextBoxFor(x => x.Age) 
    @Html.ValidationMessageFor(x => x.Age) 
    <input type="submit" value="Submit by Age" /> 
} 

@using(Html.BeginForm("Location", "Person", FormMethod.Post)) 
{ 
    @Html.TextBoxFor(x => x.Location) 
    @Html.ValidationMessageFor(x => x.Location) 
    <input type="submit" value="Submit by Location" /> 
} 

Dựa trên PersonModel trên, nếu các vị trí được gửi, xác nhận sẽ thất bại kể từ khi PersonModel dự kiến ​​Name và Age là cũng được thiết lập. Và ngược lại với Tên/Tuổi.

Ví dụ được mô tả ở trên, làm thế nào để bạn tạo các thuộc tính bắt buộc có điều kiện với khung MVC 3 sẽ làm việc với Xác thực phía máy khách cũng như Xác thực phía máy chủ khi JS bị tắt?

Trả lời

1

Bạn có thể thêm xác thực tùy chỉnh vào mô hình của mình hoặc phân lớp ValidationAttribute hoặc triển khai IValidatableObject.

ValidationAttribute cho phép bạn thêm xác thực phía máy khách tương đối đơn giản bằng cách triển khai IClientValidatable và đăng ký bộ điều hợp và phương thức mới qua jQuery. Xem Perform client side validation for custom attribute.

IValidatableObject phù hợp hơn với yêu cầu xác thực một lần khi tái sử dụng không phải là tùy chọn. Nó cũng dẫn đến mã đơn giản slighlty. Thật không may, không có cách nào dễ dàng để thực hiện xác nhận hợp lệ phía máy khách bằng cách sử dụng phương thức này.

0

Tôi đã tạo dòng dõi RequiredAttribute của riêng mình. Nó chấp nhận một tên thuộc tính boolean, điều kiện phải là điều kiện xác thực. Lưu ý rằng mã này không phải là sản phẩm đã sẵn sàng, thiếu kiểm tra lỗi và có thể thực hiện một số tinh chỉnh về kiểm tra giá trị rỗng.

[Localizable(false),AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public class RequiredIfAttribute : RequiredAttribute 
{ 
    public string BoolProperty { get; private set; } 
    public RequiredIfAttribute(string boolProperty) 
    { 
     BoolProperty = boolProperty; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (!Equals(value, null) || !string.IsNullOrEmpty(value as string)) 
      return ValidationResult.Success; 
     var boolProperty = validationContext.ObjectInstance.GetType().GetProperty(BoolProperty); 
     var boolValue = (bool)boolProperty.GetValue(validationContext.ObjectInstance, null); 
     if (!boolValue) 
      return ValidationResult.Success; 
     return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
    } 
} 

Bạn có thể tạo thuộc tính chỉ đọc để thể hiện tình trạng của bạn như dưới đây. Cũng lưu ý rằng thuộc tính Độ tuổi không được "trống" trong mã của bạn. Nếu bạn muốn hỗ trợ nó, bạn nên sử dụng một loại int (int?) Nullable int cho thuộc tính đó.

public class PersonModel 
{ 
    // helper properties 
    public bool LocationNotSet { get { return string.IsNullOrEmpty(Location); } }  
    public bool NameAndAgeNotSet { get { return string.IsNullOrEmpty(Name) && Age <= 0; } } 

    [RequiredIf("LocationNotSet")] // Requried if Location is not set 
    public string Name {get; set;} 
    [Range(1, 5), RequiredIf("LocationNotSet")] // Requried if Location is not set 
    public int Age {get; set;} 

    [RequiredIf("NameAndAgeNotSet")] // Only required if Name and Age are not set. 
    public string Location {get; set;} 
} 
Các vấn đề liên quan