7

Có thể đặt các tệp tài nguyên (.resx) trong các thư mục con bên trong App_GlobalResources không?Thư mục con trong App_GlobalResources (ASP.NET)

Ví dụ:

/App_GlobalResources/someresources/myfile.resx

/App_GlobalResources/someresources/myfile.fr-fr.resx

/App_GlobalResources/othereresources/otherfile.resx

/App_GlobalResources/othereresources/otherfile.fr-fr.resx

Hoặc, được tất cả các file resx đặt trực tiếp bên trong App_GlobalResources?

Nếu có thể sử dụng thư mục con, làm cách nào để bạn truy cập tài nguyên theo chương trình trong thư mục con?

Trả lời

12

Về mặt kỹ thuật, có thể, nhưng có một số cạm bẫy. Trước tiên, hãy để tôi chỉ cho bạn một ví dụ. Giả sử thư mục App_GlobalResources của tôi trông giống như vậy:

/App_GlobalResources 
    /Test 
     TestSubresource.resx 
    TestResource.resx 

Mỗi tệp tài nguyên có một mục duy nhất có tên là "TestString". Tôi đã thêm từng tệp tài nguyên bằng cách sử dụng trình đơn Visual Studio để nó tạo một lớp cho tôi. Theo mặc định, tất cả các lớp được thêm vào thư mục App_GlobalResources sẽ có cùng một không gian tên là Resource. Vì vậy, nếu tôi muốn sử dụng trình tạo lớp và tôi muốn Test trong không gian tên, tôi cần phải đi vào tệp TestSubresource.Designer.cs và thay đổi không gian tên theo cách thủ công. Khi tôi làm điều đó, tôi có thể làm như sau:

var rootResource = Resources.TestResource.TestString; 
var subResource = Resources.Test.TestSubResource.TestString; 

Tôi cũng có thể tham khảo chúng bằng cách sử GetGlobalResourceObject:

var rootResource = GetGlobalResourceObject("TestResource", "TestString"); 
var subResource1 = GetGlobalResourceObject("TestSubresource", "TestString"); 

Chú ý rằng tôi vẫn sử dụng "TestSubresource" như là phương tiện để tham khảo các nguồn lực trong tệp đó mặc dù nó nằm trong thư mục con. Bây giờ, một trong những sản phẩm khai thác, là tất cả các tệp phải là duy nhất trên tất cả các thư mục trong App_GlobalResources hoặc dự án của bạn sẽ ném một lỗi thời gian chạy. Nếu tôi thêm một nguồn tài nguyên có tên là "TestResource.resx" đến/Test, nó sẽ ném lỗi runtime sau:

The resource file '/App_GlobalResources/TestResource.resx' cannot be used, as it conflicts with another file with the same name.).

Điều này đúng ngay cả khi tôi thay đổi không gian tên trên tài nguyên mới. Vì vậy, trong kết luận, có thể, nhưng bạn tăng tỷ lệ mắc lỗi thời gian chạy vì hai tệp tài nguyên có tên giống nhau trong các phần khác nhau của cấu trúc thư mục App_GlobalResources được hệ thống tệp cho phép chứ không phải bởi. MẠNG LƯỚI.

1

Có thể. Ít nhất, tôi đã làm được.

Trong trang web tôi đã thêm thư mục App_GlobalResources. Bên trong nó tôi tạo ra một thư mục khác "MyFolder" và đặt MyResource.resx tập tin bên trong. Tệp Resx chứa một cặp MyKey1 - MyValue1.

Sử dụng phương pháp GetResource của lớp sau tôi được chiết xuất thành công "MyValue1" cho name = "MyKey1"

static class Class1 { 

    static Assembly FindGlobalResAssembly() { 
     foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { 
      if(asm.FullName.StartsWith("App_GlobalResources.")) 
       return asm; 
     } 
     return null; 
    } 

    public static object GetResource(string name) { 
     Assembly asm = FindGlobalResAssembly(); 
     if(asm == null) 
      return null; 
     return new ResourceManager("Resources.MyResource", asm).GetObject(name); 
    } 

} 

Cách tiếp cận này làm việc trong niềm tin Medium cũng có.

Dường như các thư mục không có sự khác biệt khi truy cập tài nguyên từ mã.

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