asp.net webforms和jquery:如何在回发之间保存/恢复jquery状态?

Egi*_*sen 4 asp.net jquery user-interface postback webforms

我正在使用jquery构建一个asp.net webforms(3.5 sp1)应用程序,我可以在其中为UI设置动画,更改其状态.它一直运行良好,直到我开始做回发,其中UI显然将自身重置为其初始状态.

所以我的问题是,在回发之间保存和恢复jquery/UI状态的最佳实践是什么?

谢谢,埃吉尔.

更新:非常感谢大家,很好的投入,糟糕的我不能将多个答案标记为"答案".

tva*_*son 5

我通常通过AJAX在会话中存储菜单状态或过滤器(div中的输入集)可见性等服务器端.当菜单展开或显示过滤器时,单击处理程序将向Web服务发出AJAX事件,该服务将记录菜单的状态或过滤用户会话中的可见性.在回发中,我使用与每个菜单/过滤器对应的会话变量,通过CSS设置它的初始状态.我发现这是更好的用户体验,因为如果您在客户端进行更改,则在加载后通过javascript更新页面时不会闪烁.

示例 - 因为我在路上这不是项目中的实际代码,可能不完整.使用jQuery.Web服务的URL将取决于您实现Web服务的方式.我正在使用ASP.NET MVC(主要是)因此我的控制器操作.

<script type='text/javascript'>
    $(document).ready( function() {
       $('#searchFilter').click( function()  {
           var filter = $(this);
           var filterName = filter.attr('id');
           var nowVisible = filter.css('display') === 'none';
           if (nowVisible) {
              filter.show();
           }
           else {
              filter.hide();
           }
           $.post('/controller/SetFilterVisibility',
                  { name: filterName, visibility: nowVisible } );
       });
    });
</script>


<div id='searchFilter' <%= ViewData["searchFilterVisibility"] %> >
    ...
</div>
Run Code Online (Sandbox Code Playgroud)

服务器端代码

[AcceptVerbs( HttpVerbs.POST )]
[Authorization]
public ActionResult SetFilterVisibility( string name, bool visible )
{
    Session[name] = visible;
    return Content( string.Empty );  // not used... 
}

[AcceptVerbs( HttpVerbs.GET )]
[Authorization]
public ActionResult SomeAction( int id )
{
    ...
    ViewData["searchFilterVisibility"] = Session["searchFilter"];
    ...
    return View();
}
Run Code Online (Sandbox Code Playgroud)


Cre*_*esh 5

我认为你指的是在回发之间保存ui小部件的状态(而不是保存用户首选项).

在特定的一系列交互之后,很多状态仅适用于特定小部件,特定用户(例如,展开此树节点,单击该网格行等).除非在页面加载中恢复状态对您很重要,否则这些内容不必进入数据库,甚至不需要进入会话.

所有那些我倾向于放入一两个对象的东西,例如:

treeState.expandedNodeId = 'foo';
gridState.selectedRowIndex = 3;
Run Code Online (Sandbox Code Playgroud)

然后我定期将它保存在隐藏的字段中:

$('.treeState').val(Sys.Serialization.JavaScriptSerializer.serialize(treeState));
Run Code Online (Sandbox Code Playgroud)

等等

该值将与回发结果一起发回,我只是deserialize从保存的值中恢复我的小部件.很烦人,但效果很好.