2012-10-28 27 views
5

tôi viết kiểm soát serverside riêng và sử dụng hình ảnh mà stoores trong giao diện điều khiển ứng dụng Resx file.In mã này hoạt động tốt:sử dụng Resx && file .resource trong tùy chỉnh asp kiểm soát máy chủ

 ResXResourceReader rsxr = new ResXResourceReader("Resource1.resx"); 

    foreach (DictionaryEntry d in rsxr) 
    { 
     Console.WriteLine(d.Key.ToString() + ":\t" + d.Value.ToString()); 
    } 

    rsxr.Close(); 

nhưng đây

 protected override void RenderContents(HtmlTextWriter output) 
    { 
     ResXResourceReader rsxr = new ResXResourceReader("Resource1.resx"); 

     base.RenderContents(output); 

     foreach (DictionaryEntry d in rsxr) 
     { 
      output.Write(d.Key.ToString()); 
     } 

    } 

tôi nhận được eror:

không thể tìm thấy tập tin 'C: \ Program Files \ Common Files \ Microsoft Shared \ DevServer \ 10.0 \ Resource1.resx'

Tôi đã cố gắng sử dụng ResourceManager nhưng nó yêu cầu tệp .resource. Tôi không thể truy cập công cụ resgen (lệnh promt không hiểu [resgen] lệnh) và cài đặt nó (erors xảy ra).

trước tiên: tại sao tôi không thể đọc .resx?

giây: cách cài đặt công cụ resgen?

cảm ơn.

+0

Đó là một thời gian trước khi bạn đã hỏi nó, nhưng tôi có một giải pháp cho bạn. – Matt

Trả lời

1

Nó được coi là thực hành tốt để lưu trữ tệp tài nguyên của bạn dưới App_GlobalResources thư mục trong ứng dụng gốc hoặc trong App_LocalResources có cùng tên với tệp kiểm soát người dùng của bạn. Vì vậy, ví dụ như người dùng điều khiển người dùng là tập tin uc.ascx trong thư mục tài nguyên cục bộ nên là uc.ascx.resx. Bằng cách đó nó được dễ dàng hơn để duy trì và asp.net sẽ tự động phát hiện nó.

Bây giờ câu trả lời của bạn:

Đầu tiên: sử dụng Server.MapPath("~/") điểm vật lý trực tiếp nơi web.config của bạn. Nếu bạn muốn sử dụng tệp tài nguyên trong thư mục Điều khiển, bạn phải viết Server.MapPath("~/Controls/Resource1.resx") để nhận đường dẫn.

Không chắc chắn bạn muốn làm gì với công cụ resgen? Khi bạn biên dịch ứng dụng của bạn, tệp tài nguyên cũng sẽ được biên dịch. chọn tệp tài nguyên của bạn và bấm F4, nó sẽ hiển thị cho bạn xây dựng hành động, chọn tài nguyên trong hành động xây dựng và tệp tài nguyên của bạn sẽ được bao gồm trong assembly.

Bạn có thể xem bài này để biết thêm thông tin: How to use image resource in asp.net website?

+2

Ok.I sử dụng tùy chọn [tài nguyên được nhúng] cho tệp .resx của tôi. Sau đó, bạn nên giải thích lý do mã này cung cấp (trong ứng dụng bảng điều khiển) MissingManifestResourceException [code] ResourceManager resourceManager = new ResourceManager ("ConsoleApplication1.Resource1.resx", GetType() .Hội,, tổ hợp); object a = resourceManager.GetObject ("line.gif"); [/ code] –

1

Từ mô tả của bạn, tôi hiểu bạn cần phải xác định vị trí và truy cập tập tin tài nguyên người dùng điều khiển của. Tôi thấy rằng nó hoạt động độc đáo theo cách sau:

  1. Tạo một App_GlobalResources vào mức độ dự án (thông qua menu ngữ cảnh Add -> Add ASP.NET Folder -> App_GlobalResources)
  2. Tạo file ressource có cùng tên như kiểm soát, nhưng bên trong App_GlobalResources. Ví dụ: nếu điều khiển được đặt tên là myControl.ascx, thì tên của tệp nguồn cấp dữ liệu cho ngôn ngữ mặc định phải là myControl.ascx.resx
  3. Tạo các tệp nguồn nạp bổ sung cho từng ngôn ngữ bạn yêu cầu. Ví dụ, nếu bạn cần tiếng Đức ("de-DE"), sau đó thêm myControl.ascx.de.resx
  4. Thêm lớp MultiLanguageUserControl như sau:

    public class MultiLanguageUserControl : System.Web.UI.UserControl 
    { 
        public string getResValue(string id) 
        { 
         var ctrlPath = TemplateControl.AppRelativeVirtualPath; 
         var ctrlFile = System.IO.Path.GetFileName(ctrlPath); 
         var resObj = GetGlobalResourceObject(ctrlFile, id); 
         if (resObj!=null) 
            return resObj.ToString(); 
         else 
            return string.Format("UNRESOLVED[{0}]", id);   
        } 
    } 
    
  5. mở mã đằng sau của myControl và làm cho nó kế thừa từ MultiLanguageUserControl thay vì từ System.Web.UI.UserControl:

    public partial class myControl : MultiLanguageUserControl { //... }

  6. Trong đoạn mã HTML , sử dụng hàm mới, ví dụ: <%=getResValue("resid")%>, trong đó "resid" là tên của chuỗi nguồn cấp dữ liệu bạn muốn tìm kiếm. Bạn cũng có thể sử dụng thẻ mã hóa HTML <%: thay vì <%=, tùy thuộc vào yêu cầu của bạn. Ngoài ra, bạn có thể sử dụng getResValue ở bất kỳ đâu trong mã C# phía máy chủ trong điều khiển người dùng của bạn để truy lục giá trị từ tệp nguồn nạp.

  7. Đảm bảo rằng bạn hỗ trợ phát hiện ngôn ngữ trong sự kiện Page_Load của trang, sử dụng điều khiển người dùng. Làm thế nào bạn có thể làm điều này là độc đáo mô tả here (tìm kiếm các chức năng InitializeCulture).

Nếu bạn muốn đọc các chuỗi tài nguyên cục bộ của trang từ bên trong điều khiển người dùng, hãy xem here.

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