3

我的 asp.net 页面将根据用户选择的报告呈现不同的控件,例如,一些报告需要 5 个下拉菜单,一些需要两个复选框和 6 个下拉菜单)。

他们可以使用两种方法选择报告。在SelectedReport=MyReport查询字符串中,或​​从下拉列表中选择它。他们通常会在查询字符串中进入带有 SelectedReport 的页面,然后更改下拉列表中选择的报告。

我的问题是,是否有使下拉菜单在选择时修改查询字符串。所以我想SelectedReport=MyNewReport在查询字符串和页面中回发。

目前它只是做一个正常的回发SelectedReport=MyReport,即使它不是当前选择的报告,它也会留在查询字符串中。

编辑:而且我还需要保留 ViewState。

我已经尝试Server.Transfer(Request.Path + "?SelectedReport=" + SelectedReport, true)在下拉列表的事件处理程序中执行此操作,但不幸的是,它是一个 Server.Transfer (以保留 ViewState)而不是一个 Response.Redirect URL 滞后于显示的内容。

也许我在问不可能的事情或者完全错误的方式。

@Craig QueryString 集合是只读的,无法修改。
@Jason那会很棒,除了我会失去 ViewState 不是吗?(对不起,我在看到您的回复后补充了这一点)。

4

6 回答 6

3

您需要在下拉菜单上关闭自动回发 - 然后,您需要连接一些将接管该角色的 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 为什么,在这种情况下,你需要保存它。请说?

于 2008-08-25T21:27:34.743 回答
0

如果它是数据更改时的自动发布,那么您应该能够使用下拉列表的“onchange”事件的服务器端处理程序重定向到新的查询字符串。如果是按钮,则在单击事件中处理服务器端。我会发布我正在谈论的内容的样本,但我正在出去接孩子。

于 2008-08-25T21:07:37.397 回答
0

您是否尝试为 DropDown 修改 SelectedIndexChanged 上的 Request.QueryString[]?这应该够了吧。

于 2008-08-25T21:09:52.290 回答
0

您可以根据非回发的查询字符串填充下拉列表,然后始终使用下拉列表中的值。这样,用户对页面的首次访问将基于查询字符串,并且他们对下拉列表所做的后续更改将更改所选报告。

于 2008-08-25T21:24:06.170 回答
0

The view state only lasts for multiple requests for the same page. Changing the query string in the URL is requesting a new page, thus clearing the view state.

Is it possible to remove the reliance on the view state by adding more query string parameters? You can then build a new URL and Response.Redirect to it.

Another option is to use the Action property on the form to clear the query string so at least the query string does not contradict what's displayed on the page after the user selects a different report.

Form.Action = Request.Path;
于 2008-08-27T05:55:37.337 回答
0

您可以使用以下函数在 asp.net 中使用 Webresource.axd 脚本修改查询字符串,如下所示。

var url = updateQueryStringParameter(window.location.href,
                                     'Search',
                                     document.getElementById('txtSearch').value);
WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("searchbutton", "",
                                  true, "aa", url, false, true));
于 2013-06-06T17:13:03.237 回答