Używam aplikacji Asp.Net MVC.

Jak w poniższym kodzie mogę uniknąć dwóch wywołań bazy danych w celu wypełnienia listy rozwijanej?

[HttpGet]
public ActionList Upload(){

// do something
//For populating drop downlist take data from db

Return View("Upload");

}

[HttpPost]
public ActionList Upload(){

//do something
//again take data from db for populating dropdown

Return View("Upload");

}

Jakiś inny sposób niż metoda ajax jQuery? Dziękuję

0
Lamps 18 lipiec 2011, 15:01

2 odpowiedzi

Najlepsza odpowiedź

Zależy to od rozmiaru danych i tego, jak często mogą się one zmieniać, ale typowym rozwiązaniem jest użycie właściwości Cache HttpContext.

public List<items> GetDropdownlistItems()
{
    string cacheKey = "dropdownlistItems";

    if (HttpContext.Current.Cache[cacheKey] != null)
    {
        return (List<items>)HttpContext.Current.Cache[cacheKey];
    }

    var items = GetItemsFromDatabase();

    HttpContext.Current.Cache.Insert(cacheKey, items, null, DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration);

    return items;
}
5
Russ Clarke 18 lipiec 2011, 15:08
Cześć... Moje menu zawiera około 50 pozycji. Czy mogę przechowywać ją w pamięci podręcznej? Czy spowoduje to jakiekolwiek problemy z wydajnością?
 – 
Lamps
18 lipiec 2011, 17:09
Nie powinno być tak źle; Jeśli Garbage Collector zdecyduje, że potrzebuje więcej pamięci, prawdopodobnie najpierw usunie elementy z pamięci podręcznej, ale to zachowanie jest zarządzane przez system, więc nie powinno być niczym, o co musisz się martwić.
 – 
Russ Clarke
18 lipiec 2011, 17:20
Ok dzięki. Jeśli użytkownik wyłączył pamięć podręczną w przeglądarce, oznacza to, że pamięć podręczna nie będzie działać?
 – 
Lamps
18 lipiec 2011, 17:40
1
Pamięć podręczna jest obsługiwana po stronie serwera.
 – 
Dismissile
18 lipiec 2011, 18:03

Mam tendencję do buforowania danych, które rzadko są zmieniane, takie jak ta.

Sprawdź Bloki aplikacji buforujących EntLibs.

Możesz załadować wszystkie dane do pamięci podręcznej przy pierwszym użyciu i ustawić czas wygaśnięcia w zależności od tego, jak szybko chcesz, aby zmiany w bazie danych zaczęły obowiązywać.

Zasadniczo dodaj warstwę między kontrolerem a bazą danych, która uruchamia kod podobny do tego:

        MyData myData = null;
        myData = (MyData )cacheManager.GetData("myData");

        if (myData == null)
        {
            myData = dataProvider.GetData();
            cacheManager.Add("myData", myData, CacheItemPriority.Normal, null, timeToExpire);
        }

        return myData;

Gdzie myData to dane potrzebne do listy rozwijanej.

1
BonyT 18 lipiec 2011, 15:06