Asp.net mvc 4 在asp.net mvc中单击浏览器后退按钮时保留dropdownlist的选定值

Asp.net mvc 4 在asp.net mvc中单击浏览器后退按钮时保留dropdownlist的选定值,asp.net-mvc-4,caching,drop-down-menu,outputcache,memorycache,Asp.net Mvc 4,Caching,Drop Down Menu,Outputcache,Memorycache,我有一个dropdownlist,用户在dropdownlist中选择一个选项,并根据该值填充一个仪表板。我的问题是,当用户单击浏览器中的“后退”按钮时,如何保留dropdownlist值以及仪表板值。我尝试了OutputCache,但OutputCache仅用于缓存呈现的HTML而不是数据,我尝试了内存缓存,但也不起作用 型号: public class InternalViewModel { public int totalclients { get; set; }

我有一个dropdownlist,用户在dropdownlist中选择一个选项,并根据该值填充一个仪表板。我的问题是,当用户单击浏览器中的“后退”按钮时,如何保留dropdownlist值以及仪表板值。我尝试了OutputCache,但OutputCache仅用于缓存呈现的HTML而不是数据,我尝试了内存缓存,但也不起作用

型号:

public class InternalViewModel
{
      public int totalclients { get; set; }
      public int clientid { get; set; }
      public DateTime? AsOFdate { get; set; }
}
控制器:

  public ActionResult Dropdownlist()
        {
            InternalViewModel app = new InternalViewModel();          
            app.totalclients = db2.AppClients.Count();          
            IEnumerable<SelectListItem> clients = db2.AppClients.Select(c => new SelectListItem
            {
                Value = c.ClientID.ToString(),
                Text = c.ClientName
            });
            ViewBag.clients = clients;       
            return PartialView(app);

        }
因此,当用户单击浏览器上的“后退”按钮并返回此页面时。我希望用户能够看到选择的dropdownlist值以及仪表板值,基本上页面不应该刷新。我怎样才能做到这一点


谢谢

你必须以某种方式坚持这个选择。几乎有两种选择:

  • 在下拉选择更改时,使用AJAX设置会话变量(服务器端)。呈现下拉列表时,应检查此会话变量,如果它存在,请将下拉列表设置为其具有的值

  • 使用本地存储。这是一种纯粹的客户端方法。基本上,当下拉列表更改时,您只需在localStorage中设置一个键。在页面加载时,从localStorage读取该键并相应地设置下拉列表

  • 第一种方法是使用更安全、更跨浏览器的选项,但即使在一些较旧版本的IE中,
    localStorage
    也有相当不错的支持,因此它不再像以前那样成为交易的破坏者

    更新

    要设置它,首先需要一个操作服务器端来响应AJAX请求。简单地说,这看起来像:

    [HttpPost]
    public ActionResult SetClientId(int clientId)
    {
        Session["ClientId"] = clientId;
        return Json(new { success = true })
    }
    
    然后,您可以使用AJAX,客户端:

    $('#clientid').on('change', function () {
        $.post('/url/to/action/above/', { clientId: $(this).val() });
        // omitted success function as there's nothing you really need to do,
        // just fire and forget
    });
    
    当您处于允许编辑
    clientid
    的操作中时,您只需尝试从
    会话设置它即可:

    model.clientid = Session["ClientId"] as int? ?? default(int);
    

    这看起来有点奇怪,但主要是因为有一个不可为null的int属性。首先,会话值存储为字符串,因此需要将该值强制转换为可为null的int(
    as int?
    )。由于我们将
    用作
    ,如果该值无法转换为int,它将被设置为
    null
    ,因此我们必须转换为可为null的值。但是,您仍然无法为该属性存储可为null的int,因此如果值为null,则使用null coalesce运算符(
    ??
    )将值设置为
    默认值(int)

    您能给我举一个第一种方法的示例吗。因此,当我试图将其放入会话时,第一次显然clientid为null,这会抛出一个错误。我想我做错了,一个简短的代码片段将非常有用。谢谢多谢了,修好了
    $('#clientid').on('change', function () {
        $.post('/url/to/action/above/', { clientId: $(this).val() });
        // omitted success function as there's nothing you really need to do,
        // just fire and forget
    });
    
    model.clientid = Session["ClientId"] as int? ?? default(int);