2013-03-20 16 views
5

W mojej witrynie ASP.NET MVC ludzie mogą wybierać między różnymi stylami css. W przyszłości nazwy tych stylów css będą przechowywane w bazie danych.Jak mogę załadować styl CSS na podstawie ustawień użytkownika?

mam następujące metody (jeszcze nie komunikować się z bazą danych):

public FileResult CssStyle() 
{ 
    string style = "/Content/wide-site.css"; 

    if (!String.IsNullOrWhiteSpace(style)) 
    { 
     return File(style, "text/css"); 
    } 

    return File("/Content/site.css", "text/css"); 
} 

I w moim _Layout.cshtml używam tej linii załadować stylów:

<link href="@Url.Action("CssStyle", "Home")" rel="stylesheet" type="text/css" /> 

Załóżmy, że ta metoda CssStyle() wysyła żądanie do bazy danych i przy każdym ładowaniu strony wykonuje zapytanie. Jaki jest najlepszy sposób, aby zapobiec tym niepotrzebnym żądaniom? Może sesja?

+0

Ile stylów masz zamiar rozwiązać? Sugerowałbym użycie hashmap/wyliczenia zamiast przechowywania zwykłego tekstu. –

+0

Co z folderem z motywami? http://stackoverflow.com/questions/769878/asp-net-mvc-themes-how-to – Amitd

Odpowiedz

3

Uruchom zapytanie, gdy jest to ważne, na przykład podczas logowania, a następnie zapisz nazwę pliku CSS w numerze Session. Musisz także odświeżyć zmienną Session, jeśli masz stronę profilu, na której użytkownicy mogą zmienić swój styl - w ten sposób, gdy ją zmienią, natychmiast zobaczą nowy styl.

Następnie w metodzie ciągnąć tę wartość z Session:

var cssFile = Session["UserStyle"]; 

na przykład.

0

Proponuję, abyś je buforował lub zapisał w zmiennej sesji.

W ten sposób nie musisz niepotrzebnie wychodzić do bazy danych za każdym razem.

0

Po pierwsze, czy potwierdziłeś, że operację tę należy zoptymalizować? Jeśli korzystasz z sesji, zazwyczaj uzyskujesz dostęp do systemu plików, który jest tej samej wielkości, przynajmniej w instalacjach lokalnych, do których dostęp ma DB.

Założę, że DB jest zdalny i przez bardzo wolne połączenie, tak, że warto zmniejszyć dostęp do DB.

Ponadto, nie jest jasne, w jaki sposób użytkownik wybiera arkusz stylów, zakładając, że będzie jakiś rodzaj parametru.

Jeśli chcesz rozwiązanie nie używając sesje, powiedzieć co najwyżej jeden dostępu DB na plik CSS dziennie, można zrobić coś takiego:

public FileResult CssStyle(variant which) 
{ 
    // Hash the function, date and which stylesheet to ensure global, 
    // valid, unique, and easily replicated filename 
    filename = md5("get_css_style" + today() + which) + ".css" 
    if (!file_exists(filename)) 
    { 
     // DB operation here 
     // create file here using filename 
    } 
    return File(filename, "text/css"); 
} 
Powiązane problemy