ASP.NET MVC:保持上一页状态

4
这是情况:我有一个搜索页面,用户可以进行复杂搜索。没有什么特别的。显示结果后,用户可以选择其中一个并移动到另一个页面(如主/详细信息)。
我有一个面包屑导航,它保存用户访问的位置,并且可以有超过4个级别(如Main-> 2Page-> 3Page-> 4Page-> NPage)。我的目标是在用户使用面包屑导航向后导航时保持复杂搜索页面上每个控件的状态,因为我不希望他们再手动设置所有这些搜索过滤器。
到目前为止,我一直在使用javascript:history.back(),但由于我的面包屑导航可能有多个级别,这并没有很有用。我正在考虑使用OutputCache来实现,但我不知道该如何操作。
更新:
我刚刚与同事交谈,他告诉我我们的某些组合框(下拉列表)是动态生成的。因此,如果用户选择第一个组合框中的一个项目,则第二个组合框将填充与第一个选择相关的数据。
1个回答

4
OutputCache 会为每个用户缓存结果。你何不尝试使用页面URL和筛选信息将信息存储在cookie中。每次执行操作时,读取cookie并使用找到的这些值(如果它们与页面URL和操作匹配)填充模型(用于搜索的自定义模型)。将模型传递给视图,让其重新填充搜索条件文本框和复选框。
更新: 当用户填写搜索过滤文本框时,你某种方式将该信息传回控制器,可能是作为某种强类型对象。
假设你的用户可以输入以下信息: -条件 -开始日期 -结束日期
定义了名为SearchCriteria的模型:
public class SearchCriteria
{
    public string Criteria { get; set; }
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }
}

你可以采取以下行动:
[HttpGet]    
public ViewResult Search()
{
    SearchCriteria criteria = new SearchCriteria();

    if (Request.Cookies["SearchCriteria"] != null)
    {
        HttpCookie cookie = Request.Cookies["SearchCriteria"];
        criteria.Criteria = cookie.Values["Criteria"];
        criteria.StartDate = cookie.Values["StartDate"] ?? null;
        criteria.EndDate = cookie.Values["EndDate"] ?? null;
    }

    return View(criteria);
}

[HttpPost]
public ActionResult Search(SearchCriteria criteria)
{
    // At this point save the data into cookie
    HttpCookie cookie;

    if (Request.Cookies["SearchCriteria"] != null)
    {
        cookie = Request.Cookies["SearchCriteria"];
        cookie.Values.Clear();
    }
    else
    {
        cookie = new HttpCookie("SearchCriteria");
    }

    cookie.Values.Add("Criteria", criteria.Criteria);

    if (criteria.StartDate.HasValue)
    {
        cookie.Values.Add("StartDate", criteria.StartDate.Value.ToString("yyyy-mm-dd"));
    }

    if (criteria.EndDate.HasValue)
    {
        cookie.Values.Add("EndDate", criteria.EndDate.Value.ToString("yyyy-mm-dd"));
    }

    // Do something with the criteria that user posted

    return View();
}

这是一种解决方案。请理解我没有测试过,我是凭记忆写的。它旨在给你一个想法,如何解决这个问题。你应该还要添加操作到SearchCriteria,以便可以检查是否适合读取cookie的操作。此外,读取和写入cookie应该移动到一个单独的方法中,以便可以从其他操作中读取它。
希望有所帮助,
Huske

不知道OutputCache会为每个用户缓存它。我正在阅读有关Cookies的内容。有关如何在MVC3中使用它们的任何提示或链接吗? - AdrianoRR
谢谢您提供的示例。如何处理动态DDL(下拉列表)?我在考虑将整个SelectList保存到Cookie上?这有意义吗? - AdrianoRR
在这种情况下,向SearchCriteria添加一个返回SelectList的属性。如果您的下拉列表中的数据太大而无法每次从数据库加载,请将该集合放入缓存中。您将需要从缓存重新加载数据到您的SelectList中。此外,仅在cookie中存储值,而不是整个内容。Cookie限制为1024个字符(或类似数量)。 - Huske
但仅存储所选项的值将使DDL只有一个选项。我应该重新创建SelectList并将先前选择的项目设置为Selected吗? - AdrianoRR
是的,这就是为什么我说你应该缓存进入下拉列表的值,这样你就不必再次重新加载它们,然后再次填充SelectList并将Selected应用于您cookie中的值。 - Huske

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接