从ASP.NET中的下拉列表修改后的查询字符串进行回发
我的asp.net页面将根据用户选择的报告来呈现不同的控件,例如一些报告需要5个下拉菜单,一些2个复选框和6个下拉菜单)。
他们可以使用两种方法选择报告。在查询字符串中使用" SelectedReport = MyReport",或者从下拉列表中选择它。对于他们来说,很常见的情况是他们进入查询字符串中带有SelectedReport的页面,然后更改下拉列表中选择的报告。
我的问题是,是否有选择使下拉列表修改查询字符串的问题。所以我想在查询字符串和页面中回传" SelectedReport = MyNewReport"。
目前,它只是进行普通的回发,即使它不是当前选择的报告,也会在查询字符串中保留" SelectedReport = MyReport"。
编辑:而且我还需要保留ViewState。
我已经尝试在Dropdown的事件处理程序中执行Server.Transfer(Request.Path +"?SelectedReport =" + SelectedReport,true)
,但是不幸的是,这是明智的,因为它是Server.Transfer(用于保存ViewState) )而不是响应。重定向网址滞后于显示的内容。
也许我问的是不可能的事情,或者完全以错误的方式去解决它。
@Craig QueryString集合是只读的,无法修改。
@Jason太好了,除了我会丢失ViewState会吗? (很抱歉,看到回复后,我补充了这一点)。
解决方案
回答
如果数据更改时是自动发布,那么我们应该能够使用下拉菜单的" onchange"事件的服务器端处理程序重定向到新的查询字符串。如果是按钮,请在click事件中处理服务器端。我会发布一个我正在谈论的内容的样本,但是我正要去接孩子。
回答
我们是否尝试过修改DropDown的SelectedIndexChanged上的Request.QueryString []?这应该够了吧。
回答
我们可以基于非回传中的querystring填充下拉列表,然后始终使用下拉列表中的值。这样,用户对页面的首次访问将基于查询字符串,并且他们对该下拉列表进行的后续更改将更改所选的报告。
回答
我们需要关闭下拉菜单中的autopostback,然后,我们需要关联一些JavaScript代码,这些代码将在下拉菜单的onchange事件的事件处理程序代码中担任该角色,我们将根据当前选择的值创建一个URL从下拉菜单中,然后使用javascript请求该页面。
编辑:这是一些快速且肮脏的代码,这些代码指示将执行此操作的技巧:
<script> function changeReport(dropDownList) { var selectedReport = dropDownList.options[dropDownList.selectedIndex]; window.location = ("scratch.htm?SelectedReport=" + selectedReport.value); } </script> <select id="SelectedReport" onchange="changeReport(this)"> <option value="foo">foo</option> <option value="bar">bar</option> <option value="baz">baz</option> </select>
显然,我们需要做更多的事情,但这确实有效,并且可以为我们提供我们所需要的东西。我建议我们使用JavaScript工具箱(我使用MochiKit,但并不适合所有人),以便尽可能使用不引人注目的JavaScript技术来完成一些更艰苦的工作(这与本示例中使用的方法不同)。
@Ray:我们使用ViewState吗?我很抱歉。 :P在这种情况下,为什么需要保留它。请说?
回答
视图状态仅持续同一页面的多个请求。更改URL中的查询字符串正在请求一个新页面,从而清除了视图状态。
是否可以通过添加更多查询字符串参数来消除对视图状态的依赖?然后,我们可以构建一个新的URL和Response.Redirect。
另一个选择是使用表单上的Action属性清除查询字符串,以便至少在用户选择其他报表后查询字符串不会与页面上显示的内容冲突。
Form.Action = Request.Path;