2012-02-28 5 views
1

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

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 Page

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

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

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

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

ответ

0

Вы можете сохранить результаты в 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

Это решение отлично работает. Я относительный новичок, когда речь идет о веб-программировании, поэтому я все еще изучаю все доступные механизмы. Спасибо за помощь. –

Смежные вопросы