2011-01-20 41 views
5

Tôi tạo ra một thuộc tính kế thừa như thế này trong ASP.NET MVC3:Xác thực phía máy khách không hoạt động khi hít từ RequiredAttribute trong ASP.NET MVC 3?

public sealed class RequiredFromResourceAttribute : RequiredAttribute 
{ 
    public RequiredFromResourceAttribute(string errorResourceName, string errorResourceTypeName) 
    { 
     this.ErrorMessageResourceName = errorResourceName; 
     this.ErrorMessageResourceType = Type.GetType(errorResourceTypeName); 
    } 
} 

Và sử dụng nó như thế này:

[RequiredFromResource("Title", "Resources.Resource, MyProject.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")] 
public string Title { get; set; } 

Nó không làm việc và MVC phớt lờ nó. Sau đó, tôi tạo một lớp đơn giản hơn, chỉ được kế thừa từ RequiredAttribute như sau:

public class MyRequiredAttribute : RequiredAttribute 
{ 
} 

Tôi sử dụng nó như tôi đã nói. Nhưng nó không hoạt động trở lại.

Mặc dù, tất cả các cách này đều hoạt động hoàn hảo trên "DisplayNameAtrribute".

Sự cố là gì?

+0

Theo tôi, câu trả lời của marcind xử lý điều này tốt hơn SkipHarris '. RequiredAttributeAdapter trong Skip's dường như làm cho xác nhận phía máy khách sử dụng thuộc tính bắt buộc thường xuyên thay vì thuộc tính RequiredFromResourceAttribute. – Keerigan

Trả lời

3

Bạn có thể khắc phục điều này bằng cách thêm đoạn mã sau trong Global.asax: (tìm thấy câu trả lời here)

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredLocalizableAttribute), typeof(RequiredAttributeAdapter)); 

Hoặc, bằng cách sử dụng giải pháp của marcind, tôi thấy rằng hàm tạo cho ModelClientValidationRequiredRule yêu cầu thông báo lỗi. Đây là phiên bản cập nhật bao gồm tên hiển thị cho trường:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     string msg = FormatErrorMessage(metadata.GetDisplayName()); 
     yield return new ModelClientValidationRequiredRule(msg); 
    } 
+0

@ marcind của câu trả lời dường như xử lý này tốt hơn nhiều. Sử dụng RequiredAttributeAdapter dường như gọi thuộc tính bắt buộc thường xuyên thay vì thuộc tính tùy chỉnh. – Keerigan

+0

Câu trả lời của Skip dường như chỉ làm việc tốt cho tôi. Cảm ơn Skip. –

3

Chỉ xác thực phía máy khách không hoạt động với các thuộc tính được kế thừa. Lý do cho điều đó là MVC sử dụng sự bình đẳng kiểu nghiêm ngặt khi ánh xạ các thuộc tính phía máy chủ đến các hành vi xác thực ứng dụng khách.

Để làm việc xung quanh này, bạn sẽ cần thuộc tính tùy chỉnh của bạn để thực hiện IClientValidatable:

public class MyRequiredAttribute : IClientValidatable { 
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { 
     yield return new ModelClientValidationRequiredRule(); 
    } 
} 
+1

Vì vậy, tại sao cùng một cách hoạt động trên MVC2! –

+1

Đây là cách tốt hơn để xử lý điều này hơn @SkipHarris '. Sử dụng RequiredAttributeAdapter dường như gọi thuộc tính bắt buộc thường xuyên thay vì thuộc tính tùy chỉnh. – Keerigan

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