2012-10-28 7 views
5

piszę własną kontrolę stronie serwera i za pomocą obrazów, które stoores w aplikacji konsoli .resx file.In ten kod działa poprawnie:korzystania .resx && plików .resource w niestandardowym asp sterowania serwera

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

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

    rsxr.Close(); 

ale tutaj

 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()); 
     } 

    } 

uzyskać eror:

nie można odnaleźć pliku 'C: Program Files \ \ Common Files \ Microsoft Shared \ DevServer \ 10.0 \ Resource1.resx'

Próbowałem użyć ResourceManager, ale wymaga pliku .resource. Nie mogę uzyskać dostępu do narzędzia resgen (polecenie promt nie rozumie polecenia [resgen]) i zainstaluj je (pojawiły się błędy).

Po pierwsze: dlaczego nie mogę przeczytać .resx?

sekunda: jak zainstalować narzędzie Resgen?

dzięki.

+0

Jakiś czas temu, kiedy go o to poprosiłeś, ale mam dla ciebie rozwiązanie. – Matt

Odpowiedz

1

Uważa się za dobrą praktykę przechowywanie pliku zasobów w folderze App_GlobalResources w katalogu głównym aplikacji lub w App_LocalResources o tej samej nazwie, co plik kontrolny użytkownika. Tak więc na przykład kontrola użytkownika to plik uc.ascx w lokalnym folderze zasobów powinien być uc.ascx.resx. W ten sposób łatwiej jest go utrzymać, a asp.net automatycznie go wykryje.

Teraz Twoje odpowiedzi:

pierwszy: użytku Server.MapPath("~/") punktów fizycznej bezpośrednio gdzie web.config jest. Jeśli chcesz użyć pliku zasobów w folderze Controls, musisz napisać Server.MapPath("~/Controls/Resource1.resx"), aby uzyskać ścieżkę.

Not sure co chcesz zrobić z narzędziem Resgen? Podczas kompilowania aplikacji zostanie również skompilowany plik zasobów. wybierz plik zasobów i kliknij F4, pokaże Ci działanie kompilacji, wybierz zasób w akcji kompilacji, a plik zasobów zostanie dołączony do zestawu.

Można przeglądać ten post uzyskać więcej informacji: How to use image resource in asp.net website?

+2

Ok. Używam opcji [osadzonego zasobu] dla mojego pliku .resx. Następnie należy wyjaśnić, dlaczego ten kod daje (w aplikacji konsoli) MissingManifestResourceException [kod] ResourceManager resourceManager = new ResourceManager ("ConsoleApplication1.Resource1.resx", GetType() .Montaż); obiekt a = resourceManager.GetObject ("line.gif"); [/kod] –

1

z twojego opisu, rozumiem, trzeba zlokalizować i uzyskać dostęp do pliku zasobów kontrolki autora. Okazało się, że to działa dobrze w następujący sposób:

  1. Create a App_GlobalResources na poziomie projektu (za pomocą menu kontekstowego Add -> Add ASP.NET Folder -> App_GlobalResources)
  2. utworzyć plik ressource o tej samej nazwie co kontrolą, ale wewnątrz App_GlobalResources. Na przykład, jeśli formant ma nazwę myControl.ascx, nazwa pliku źródła zasobów dla domyślnego języka musi być myControl.ascx.resx
  3. Utwórz dodatkowe pliki ressource dla każdego wymaganego języka. Na przykład, jeśli potrzebujesz niemieckiego ("de-DE"), dodaj myControl.ascx.de.RESX
  4. Dodaj klasę MultiLanguageUserControl następująco:

    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. Otwórz kod tył od myControl i sprawiają, że dziedziczą MultiLanguageUserControl zamiast z System.Web.UI.UserControl:

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

  6. W kodzie HTML , użyj nowej funkcji, np .: <%=getResValue("resid")%>, gdzie "resid" to nazwa łańcucha zasobów ressource, który chcesz wyszukać. Można również użyć znacznika kodu HTML <%: zamiast <%=, w zależności od wymagań. Alternatywnie możesz użyć getResValue w dowolnym miejscu w kodzie C# po stronie serwera w kontrolce użytkownika, aby pobrać wartość z pliku ressource.

  7. Upewnij się, że obsługuje wykrywanie języka w zdarzenie Page_Load strony, która korzysta z formantu użytkownika. Jak to zrobić, jest ładnie opisane here (poszukaj funkcji InitializeCulture).

Jeśli chcesz odczytywać lokalne ciągi zasobów strony z poziomu kontroli użytkownika, spójrz na here.

Powiązane problemy