2013-02-03 25 views
22

Tại sao thuộc tính DataAnnotation gặp khó khăn khi truy cập tài nguyên được tạo bởi PublicResxFileCodeGenerator?Bản địa hóa và Chú thích dữ liệu. GlobalResourceProxyGenerator và PublicResxFileCodeGenerator

tôi thấy rằng các thuộc tính sau:

[Compare("NewPassword", ErrorMessageResourceName = "RegisterModel_ConfirmPasswordError", ErrorMessageResourceType = typeof(Resources.Global))] 

sẽ không tìm thấy tài nguyên nếu nó đã được tạo ra với PublicResxFileCodeGenerator. Tuy nhiên, một tài nguyên giống hệt được tạo bằng GlobalResourceProxyGenerator sẽ hoạt động chính xác. Cả hai tệp tài nguyên được đặt thành Nội dung và nằm trong App_GlobalResources. Tôi đã thử đặt ngôn ngữ mặc định trong App_LocalResources quá nhưng có vẻ như không tạo ra sự khác biệt nào. Thử nghiệm của tôi là ngôn ngữ phụ của tôi (GlobalResourceProxyGenerator) hoạt động nhưng ngôn ngữ chính của tôi (PublicResxFileCodeGenerator) ném một ngoại lệ (nó không tìm thấy tệp tài nguyên). Nếu tôi chuyển đổi sang GlobalResourceProxyGenerator thì mọi thứ đều ổn (nhưng rõ ràng là không có quyền truy cập công cộng).

Có ai biết tại sao điều này không? Tôi muốn chuyển tài nguyên sang một hội đồng khác trong tương lai.

Trả lời

20

Đó là vì bạn đã đặt tệp tài nguyên của mình bên trong thư mục App_GlobalResources là một thư mục đặc biệt trong ASP.NET. Điều này sẽ hoạt động nếu bạn đặt tệp tài nguyên của mình ở một nơi khác. Đây cũng có thể là một dự án hoàn toàn riêng biệt với ứng dụng ASP.NET MVC của bạn.

Dưới đây là các bước bạn có thể làm công việc này:

  1. Tạo một ứng dụng ASP.NET MVC 3 mới sử dụng mẫu internet mặc định
  2. Thêm một tập tin ~/Messages.resx chứa chuỗi RegisterModel_ConfirmPasswordError nguồn
  3. Đặt công cụ tùy chỉnh thành PublicResXFileCodeGenerator cho tệp tài nguyên này:

    enter image description here

  4. Thêm một mô hình:

    public class MyViewModel 
    { 
        [Compare("NewPassword", 
          ErrorMessageResourceName = "RegisterModel_ConfirmPasswordError", 
          ErrorMessageResourceType = typeof(MvcApplication1.Messages))] 
        public string Password { get; set; } 
    
        public string NewPassword { get; set; } 
    } 
    
  5. Bộ điều khiển:

    public class HomeController : Controller 
    { 
        public ActionResult Index() 
        { 
         return View(new MyViewModel()); 
        } 
    
        [HttpPost] 
        public ActionResult Index(MyViewModel model) 
        { 
         return View(model); 
        } 
    } 
    
  6. Xem:

    @model MyViewModel 
    
    @using (Html.BeginForm()) 
    { 
        <div> 
         @Html.LabelFor(x => x.Password) 
         @Html.EditorFor(x => x.Password) 
         @Html.ValidationMessageFor(x => x.Password) 
        </div> 
    
        <div> 
         @Html.LabelFor(x => x.NewPassword) 
         @Html.EditorFor(x => x.NewPassword) 
         @Html.ValidationMessageFor(x => x.NewPassword) 
        </div> 
    
        <button type="submit">OK</button> 
    } 
    

Sau đó, bạn có thể bắt đầu khoanh vùng bằng cách cung cấp dịch tương ứng:

  • Messages.fr-FR.resx
  • Messages.de-DE.resx
  • Messages.it-IT.resx
  • Messages.es-ES.resx
  • ...

UPDATE:

tôi được hỏi trong phần ý kiến ​​gì quá đặc biệt về App_GlobalResources thư mục và tại sao nó không làm việc với nó. Vâng, thực sự bạn có thể làm cho nó hoạt động. Tất cả những gì bạn cần làm là đặt Build Action thành Embedded Resource. Theo mặc định khi bạn thêm một tập tin vào thư mục App_GlobalResources, Visual Studio đặt nó vào Content nghĩa là khu vực này sẽ không được đưa vào lắp ráp runtime và ASP.NET MVC không thể tìm thấy nó:

enter image description here

+0

Cảm ơn câu trả lời. Tôi có thể thề rằng tôi đã thử điều này nhưng có thể tôi đã có một sự pha trộn với một số vấn đề khác (một nỗ lực bị hỏng để 'sửa chữa' DislayAttribute là một vấn đề khác tôi phải chịu đựng). Quan trọng nhất là tôi quan tâm nhiều hơn đến lý do tại sao. Tại sao không tìm được tệp tài nguyên này khi đang ở trong Global_Resources? Quá trình thực hiện VS nào khiến cho tệp không được đặt đúng vị trí và tại sao? Bạn có biết? – Quibblesome

+0

@Quibblesome, tôi đã cập nhật câu trả lời của tôi để giải quyết câu hỏi của bạn và cách làm cho nó hoạt động với thư mục 'App_GlobalResources'. –

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