2013-02-21 27 views
8

Tôi có đoạn mã sau:ASP.NET MVC4: Một cuộc tranh cãi thuộc tính phải là một biểu thức hằng số, typeof biểu hiện hoặc tạo mảng biểu hiện của một loại tham số thuộc tính

[Required(ErrorMessage = MessageModel.translateMessage("required")))] 
    [Display(Name= MessageModel.translateMessage("id"))] 
    public string user_id { get; set; } 

Tôi cố gắng để làm cho các thông báo lỗi động nhưng tôi nhận được báo lỗi khi biên soạn .:

"An attribute argument must be a constant expression , typeof expression or array creation expression of an attribute parameter type."

Bất kỳ giải pháp cho vấn đề này?

+0

Kiểm tra câu hỏi này: http://stackoverflow.com/questions/3814866/dynamic-parameters-for-attributes –

+1

Dẫn đến bài đăng nào của Eric Lippert: http://blogs.msdn.com/b/ericlippert/ lưu trữ/2009/02/02/thuộc tính-vs-attributes.aspx –

+0

bản sao có thể có của [Đối số thuộc tính động C#] [http://stackoverflow.com/questions/1093466/c-sharp-dynamic-attribute-arguments) – jgauffin

Trả lời

3

Thông báo lỗi cho biết "đối số thuộc tính phải là biểu thức liên tục ...".

Điều này có nghĩa là đối số cho thuộc tính DisplayName phải là biểu thức không đổi (chẳng hạn như chuỗi, số nguyên, v.v.) hoặc bất kỳ loại biểu thức nào khác được liệt kê trong thông báo lỗi.

Nếu bạn muốn để bản địa hoá một tài sản sau đó bạn cần một thuộc tính có hỗ trợ it.If bạn đang sử dụng ASP.Net 4 sau đó DisplayAttribute nên như thế này:

[Display(Name="ID",Resource=typeof(MessageModel.translateMessage("id")))] 
public string user_id { get; set; } 

Ngoài ra hãy kiểm tra answer này từ Darin

+1

translateMessage ("id") không phải là một loại vì vậy tôi nghĩ rằng nó không hoạt động – MiaoWin

9

Trước tiên, bạn tạo tệp .resx tài nguyên, điều này sẽ chứa các chuỗi được bản địa hóa của bạn.

Khi bạn khai báo thuộc tính bạn đặt đối số ResourceType. Điều này làm cho các đối số Name, ShortName và Description được sử dụng như một khóa tài nguyên thay vì một giá trị.

[Display(Name = "GenreName", ShortName = "GenreShortName", Description = "GenreDescription", ResourceType = typeof(MyResources))] 
public string Genre { get; set; } 
2

Trả lời rất muộn.

Giá trị thông số dữ liệu chú thích yêu cầu hằng số, chuỗi thực tế. Vì vậy, bạn không thể viết một phương pháp ở đây. Bạn có cần bất kỳ loại nội địa hóa nào sau đó tạo tệp tài nguyên không. Sau đó viết mã như thế này. Ở đây "RequiredField" và "Email" là khóa được tạo trong tệp tài nguyên và "ViewModelResource" là tên của tệp tài nguyên.

[Required(ErrorMessageResourceName = "RequiredField", ErrorMessageResourceType = typeof(ViewModelResource))] 
[Display(Name = "Email", ResourceType=typeof(ViewModelResource))] 
public string Email{ get; set; } 

Nếu bạn muốn thông báo tùy chỉnh về điều kiện thì hãy tạo "Chú thích dữ liệu tùy chỉnh" của riêng bạn tùy thuộc vào điều kiện.

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