MVC3在更改页面时保存搜索结果

时间:2012-02-28 15:06:38

标签: asp.net-mvc-3

我有一个搜索页面,您可以根据姓名,电话号码,帐号或客户编号搜索客户。然后我浏览了7个不同的数据库,试图匹配这些东西以带回结果。因此,我宁愿只运行一次搜索并记住我可以在页面中显示的结果。下面是我用于SearchResults页面的ViewModel。

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 :(得分:0)

如何缓存它,一个例子是通过Windows AppFabric

答案 1 :(得分: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();
}

您可以使用Session状态执行相同的操作,然后您不必在每个操作结束时将其保存回来,但是您有一些额外的开销,并且您必须确保在你已经完成了,或者你可以在以后获得一些时髦的结果。只是需要注意的一些事项。