MVC3 Сохранить результаты поиска при смене страниц - PullRequest
1 голос
/ 28 февраля 2012

У меня есть страница поиска, где вы можете искать клиента по имени, номеру телефона, номеру счета или номеру клиента. Затем я просматриваю 7 разных баз данных, чтобы попытаться сопоставить их, чтобы получить результаты. Из-за этого я предпочел бы выполнить поиск только один раз и запомнить результаты, которые затем можно отобразить на страницах. Ниже показана модель представления, которую я использую для своей страницы SearchResults.

public class SearchResultsViewModel
{
    public IEnumerable<CustomerSearchResults> SearchResults { get; set; }
    public PagingInfo PagingInfo { get; set; }
}


public class PagingInfo
{
    public int TotalItems { get; set; }
    public int ItemsPerPage { get; set; }
    public int CurrentPage { get; set; }

    public int TotalPages {
        get { return (int)Math.Ceiling((decimal)TotalItems / ItemsPerPage); }
    }
}

Вот код контроллера для страницы SearchResults

public ActionResult SearchResults(int page = 1)
    {
        SearchResultsViewModel srvm = new SearchResultsViewModel
        {
            SearchResults = res.Skip((page - 1) * pageSize).Take(pageSize),
            PagingInfo = new PagingInfo { CurrentPage = page, ItemsPerPage = pageSize, TotalItems = res.Count() }
        };
        ViewBag.CurrentPage = page;
        return View("SearchResults", srvm);
    }

    [HttpPost]
    public ActionResult Index(IndexViewModel vm)
    {
        res = GetSearchResults(vm);
        return SearchResults();
    }

res - это глобальная переменная в контроллере. Я подумал, может быть, мне удастся сохранить данные таким образом, чтобы они отображались на разных страницах, но довольно быстро обнаружил, что каждый раз, когда я открываю представление, я получаю новый контроллер, так что это не работает.

Просмотр кодов просто отображает результаты поиска в таблице, а внизу есть вспомогательный HTML-код, который показывает ссылки на номера страниц. Ссылки на номера страниц являются якорями, вызывающими действие SearchResults с правильным номером страницы.

Можно ли сохранить данные для использования формы страницы на странице или это невозможно? Есть ли лучший способ для меня это сделать?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2012

Вы можете сохранить результаты в TempData.

public ActionResult SearchResults(int page = 1)
{
    res = (SearchResults)TempData["results"];
    SearchResultsViewModel srvm = new SearchResultsViewModel
    {
        SearchResults = res.Skip((page - 1) * pageSize).Take(pageSize),
        PagingInfo = new PagingInfo { CurrentPage = page, ItemsPerPage = pageSize, TotalItems = res.Count() }
    };
    ViewBag.CurrentPage = page;
    TempData["results"] = res;
    return View("SearchResults", srvm);
}

[HttpPost]
public ActionResult Index(IndexViewModel vm)
{
    res = GetSearchResults(vm);
    TempData["results"] = res;
    return SearchResults();
}

Вы можете сделать то же самое с состоянием сеанса, и вам не нужно сохранять его обратно в конце каждого действия, но у вас естьэто требует дополнительных затрат, и вы должны позаботиться о том, чтобы избавиться от них, когда закончите, иначе у вас могут получиться несколько забавных результатов.Просто некоторые вещи, на которые стоит обратить внимание.

0 голосов
/ 28 февраля 2012

Как насчет кеширования, один пример - Windows AppFabric

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...