2010-04-22 19 views
13

Tại sao tôi không thể làm như thế này?Tại sao tôi không thể sử dụng tài nguyên làm ErrorMessage với DataAnnotations?

[Required(ErrorMessage = "*")] 
[RegularExpression("^[a-zA-Z0-9_]*$", ErrorMessage = Resources.RegistrationModel.UsernameError)] 
public string Username { get; set; } 

Thông báo lỗi cho tôi biết điều gì?

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

Trả lời

32

Khi bạn đang sử dụng thuộc tính ErrorMessage chỉ chuỗi cố định hoặc chuỗi ký tự có thể được gán cho nó.

Sử dụng ErrorMessageResourceTypeErrorMessageResourceName để thay thế cho tài nguyên của bạn.

[RegularExpression(
    "^[a-zA-Z0-9_]*$", 
    ErrorMessageResourceType=typeof(Resources.RegistrationModel), 
    ErrorMessageResourceName= "UsernameError" 
)] 

Lưu ý rằng các nguồn lực phải công (có thể được thiết lập trong trình soạn thảo tài nguyên).

Setting resource access to public http://img402.imageshack.us/img402/504/98454371.jpg

+1

Điều gì xảy ra nếu tài nguyên ở trong App_GlobalResources? Bạn không thể thay đổi Trình sửa đổi truy cập cho globalresources. Bạn có bị buộc phải di chuyển các tài nguyên đó đến nơi khác để họ làm việc với DataAnnotations không? –

+0

@JohanVauhkonen bạn có thể thay đổi Action Build thành 'Embedded Resource' và Custom Tool thành' PublicResXFileCodeGenerator' –

+0

Tuyệt vời, cảm ơn! –

0

Nó có nghĩa là bạn không thể xác định giá trị của các đối số bạn đang đi vào thuộc tính tại runtime, nó phải có ít compile time nên giá trị được nhúng vào assembly.

Giá trị thông báo lỗi cần phải là biểu thức liên tục.

Để biết thông tin, đối số thuộc tính chỉ có thể là các loại bool, byte, char, ngắn, int, long, float, double, string, System.Type và enums.

+0

Không thực sự giải quyết vấn đề trong OP. – AxelEckenberger

+1

Thực ra, câu trả lời của David trực tiếp đề cập đến câu hỏi được đặt ra. –

0

Thay vào đó, bạn nên xem các thuộc tính ErrorMessageResourceNameErrorMessageResourceType thuộc tính này. Chúng cho phép thông báo lỗi được lấy từ một tài nguyên.

+0

Loại tài nguyên sẽ là gì nếu được tìm nạp từ thư mục App_GlobalResources? –

+0

Tài nguyên.RegistrationModel, với dự đoán? –

+0

@Jova: xem chỉnh sửa trong bài đăng của tôi. – AxelEckenberger

1

Hãy thử FluentModelMetaDataProvider.

Được quản lý để sử dụng tài nguyên cho các thông báo lỗi theo kiểu được nhập mạnh mẽ.

Trông như thế này:

using System.Web.Mvc.Extensibility; 

namespace UI.Model 
{ 
    public class StoreInputMetadata : ModelMetadataConfigurationBase<StoreInput> 
    { 
     public StoreInputMetadata() 
     { 
      Configure(m => m.Id) 
       .Hide(); 
      Configure(model => model.Name) 
       .Required(Resources.Whatever.StoreIsRequired) 
       .MaximumLength(64, Resources.Whatever.StoreNameLengthSomething); 
     } 
    } 
} 

được thông báo lỗi nói với tôi là gì?

Đối số thuộc tính phải là biểu thức liên tục, biểu thức typeof hoặc biểu thức tạo mảng của loại thông số thuộc tính.

Nó đã tự giải thích. C# không phải là ngôn ngữ động như Ruby, nơi bạn có thể viết các lớp thừa hưởng lớp cơ sở ngẫu nhiên khi chạy. :)

Here's những gì Skeet nói về điều này.

1

Xin xem liên kết này: http://code.msdn.microsoft.com/Getting-Started-WCF-RIA-1469cbe2/sourcecode?fileId=19242&pathId=774666288 (liên kết bị hỏng, nhưng để lại cho mục đích ghi công)

public sealed partial class RegistrationData 
{ 
    [Key] 
    [Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(ErrorResources))] 
    [Display(Order = 0, Name = "UserNameLabel", ResourceType = typeof(RegistrationDataResources))] 
    [RegularExpression("^[a-zA-Z0-9_]*$", ErrorMessageResourceName = "ValidationErrorInvalidUserName", ErrorMessageResourceType = typeof(ErrorResources))] 
    [StringLength(255, MinimumLength = 4, ErrorMessageResourceName = "ValidationErrorBadUserNameLength", ErrorMessageResourceType = typeof(ErrorResources))] 
    public string UserName { get; set; } 
+0

+1 để hiển thị danh sách đầy đủ các thuộc tính sử dụng mẫu này. Đặc biệt, thật dễ dàng để bỏ lỡ Hiển thị khác với phần còn lại. "Tên" là tên trong tệp tài nguyên ... – Elton

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