Javascript 查询字符串参数 这个想法:

Javascript 查询字符串参数 这个想法:,javascript,c#,session,query-string,hidden-field,Javascript,C#,Session,Query String,Hidden Field,只有两列的自定义gridview。与传统的网格视图中有多列值不同,我在两列中有多列值。下面是一个屏幕链接,显示结果良好 现在网格视图工作正常,并且它的值在页面加载时按其应该的方式填充,我正在合并与网格视图相关联的传统功能。例如搜索、筛选、排序和分页。这些是我希望网格视图具有的四个主要功能 问题是: 到目前为止,搜索、过滤、排序和分页都正常工作;然而,它们都有一个共同的问题:我不能将这些特性结合起来。然而,我希望能够在向项目中添加查询字符串并完全重构代码后,每个特性只工作一次 例如:如果我选择

只有两列的自定义gridview。与传统的网格视图中有多列值不同,我在两列中有多列值。下面是一个屏幕链接,显示结果良好

现在网格视图工作正常,并且它的值在页面加载时按其应该的方式填充,我正在合并与网格视图相关联的传统功能。例如搜索、筛选、排序和分页。这些是我希望网格视图具有的四个主要功能

问题是:
到目前为止,搜索、过滤、排序和分页都正常工作;然而,它们都有一个共同的问题:我不能将这些特性结合起来。然而,我希望能够在向项目中添加查询字符串并完全重构代码后,每个特性只工作一次

例如:如果我选择按新筛选,然后按创建日期排序,我会单击“新建”,然后单击“创建日期”。当我单击“新建”时,查询字符串看起来像“视图=新建&排序=客户&目录=ASC&页面=1”。这是意料之中的,但意外的结果是当我单击“创建日期”时;查询字符串更改为“view=all&sort=creaon&dir=ASC&page=1”。视图在不应更改时已更改

这一事实对于所有测试用例都是一样的。隐藏字段正在接收值,但由于其值是在单击事件中指定的,因此不会在回发过程中保留其值。我在过去没有遇到过隐藏字段这样做的问题,所以我想知道我在这一点上做错了什么,我过度寻找了什么?另外,如果这不是解决这个问题的正确方法,那么会是什么

代码
现在,我所能提供的只是这个特殊问题的相关代码;搜索值由会话处理,其余值由隐藏字段处理

分页元素是在代码隐藏中的页面加载时创建的

JavaScript:

function setView(id, mode) {
    document.getElementById('PlaceHolderMainLower_PackageView_hfViewMode').setAttribute('Value', mode);
    setHref(id);
}

function setSort(id, mode) {
    document.getElementById('PlaceHolderMainLower_PackageView_hfSortMode').setAttribute('Value', mode);
    setHref(id);
}

function setPage(id, page) {
    document.getElementById('PlaceHolderMainLower_PackageView_hfPageIndex').setAttribute('Value', page);
    setHref(id);
}

function setHref(id) {
    var view = document.getElementById('PlaceHolderMainLower_PackageView_hfViewMode').value;
    var sort = document.getElementById('PlaceHolderMainLower_PackageView_hfSortMode').value;
    var dir = document.getElementById('PlaceHolderMainLower_PackageView_hfSortDirection').value;
    var page = document.getElementById('PlaceHolderMainLower_PackageView_hfPageIndex').value;

    document.getElementById(id).href = 'ActivePackages.aspx?' + 'view=' + view + '&sort=' + sort + '&dir=' + dir + '&page=' + page;
    __doPostBack();
}
CSS:

HTML:


按状态查看:
排序方式:
C#:

private const string pageLinkTemplateHTML=@“{2}”;
私有void BuildPaging(){
divPages.InnerHtml=@”;

对于(int i=1;i,正如我在评论中所说,您可以使用变量来存储选择的状态。例如:

// do the same for your other variables
var view = 'all';
function setView(id, mode) {
    view = mode;
    setHref(id);
}

function setHref(id) {
    // now you don't need to read view, sort,
    // dir and page from DOM elements, they are already there
    document.getElementById(id).href = 'ActivePackages.aspx?' + 'view=' + view + '&sort=' + sort + '&dir=' + dir + '&page=' + page;
    __doPostBack();
}

// on page load, you read the querystring from the url, check for the values and put them back into variables
window.addEventListener('load', function(){
    var query_string = {};
    var query = window.location.search.substring(1);
    var vars = query.split("&");
    for (var i=0;i<vars.length;i++) {
        var pair = vars[i].split("=");
        // If first entry with this name
        if (typeof query_string[pair[0]] === "undefined") {
            query_string[pair[0]] = decodeURIComponent(pair[1]);
            // If second entry with this name
        } else if (typeof query_string[pair[0]] === "string") {
            query_string[pair[0]] = [query_string[pair[0]],decodeURIComponent(pair[1])];
            // If third or later entry with this name
        } else {
            query_string[pair[0]].push(decodeURIComponent(pair[1]));
        }
    }
    // do the same for your other parameters
    if(query_string.hasOwnProperty('view')){
        view = query_string.view;
    }
});
//对其他变量执行相同的操作
变量视图='全部';
功能设置视图(id,模式){
视图=模式;
setHref(id);
}
函数setHref(id){
//现在您不需要阅读视图、排序、,
//来自DOM元素的dir和page,它们已经存在了
document.getElementById(id).href='ActivePackages.aspx?'+'view='+view+'&sort='+sort+'&dir='+dir+'&page='+page;
__doPostBack();
}
//在页面加载时,从url读取查询字符串,检查值并将它们放回变量中
addEventListener('load',function()){
var query_string={};
var query=window.location.search.substring(1);
var vars=query.split(&);

对于(var i=0;i,正如我在评论中所说,您可以使用变量来存储选择的状态。例如:

// do the same for your other variables
var view = 'all';
function setView(id, mode) {
    view = mode;
    setHref(id);
}

function setHref(id) {
    // now you don't need to read view, sort,
    // dir and page from DOM elements, they are already there
    document.getElementById(id).href = 'ActivePackages.aspx?' + 'view=' + view + '&sort=' + sort + '&dir=' + dir + '&page=' + page;
    __doPostBack();
}

// on page load, you read the querystring from the url, check for the values and put them back into variables
window.addEventListener('load', function(){
    var query_string = {};
    var query = window.location.search.substring(1);
    var vars = query.split("&");
    for (var i=0;i<vars.length;i++) {
        var pair = vars[i].split("=");
        // If first entry with this name
        if (typeof query_string[pair[0]] === "undefined") {
            query_string[pair[0]] = decodeURIComponent(pair[1]);
            // If second entry with this name
        } else if (typeof query_string[pair[0]] === "string") {
            query_string[pair[0]] = [query_string[pair[0]],decodeURIComponent(pair[1])];
            // If third or later entry with this name
        } else {
            query_string[pair[0]].push(decodeURIComponent(pair[1]));
        }
    }
    // do the same for your other parameters
    if(query_string.hasOwnProperty('view')){
        view = query_string.view;
    }
});
//对其他变量执行相同的操作
变量视图='全部';
功能设置视图(id,模式){
视图=模式;
setHref(id);
}
函数setHref(id){
//现在您不需要阅读视图、排序、,
//来自DOM元素的dir和page,它们已经存在了
document.getElementById(id).href='ActivePackages.aspx?'+'view='+view+'&sort='+sort+'&dir='+dir+'&page='+page;
__doPostBack();
}
//在页面加载时,从url读取查询字符串,检查值并将它们放回变量中
addEventListener('load',function()){
var query_string={};
var query=window.location.search.substring(1);
var vars=query.split(&);

对于(var i=0;iYou正在尝试设置DOM元素中的文本值,然后将其读回。这可能是问题所在。我会将当前视图存储在变量中,或者使用单选按钮,而不是通过onclick函数设置其值的按钮。您正在尝试设置DOM元素中的文本值,然后将其读回。这可能是错误的这个问题。我要么将当前视图存储在变量中,要么使用单选按钮,而不是通过onclick函数设置其值的按钮。但是这些变量的值是否会在回发过程中保持不变?我以前使用字符串数组存储值,但仍然存在问题。尽管我确实相信问题正在发生彼此之间更好一些。回发的具体作用是什么?如果它重新加载页面,您必须在之后再次设置这些变量。我将在代码中编辑一些内容,向您展示我将如何执行。我只是尝试使用变量的想法,但没有用,同样的事情仍然发生在查询字符串上。此链接应该非常有用。So若要继续此操作,我必须为查询字符串中的每个属性执行顺序if块?这似乎有点过于复杂,但目前我对任何事情都持开放态度。我将尝试一下,并让您知道它是如何进行的。此外,“过于复杂”的注释与我没有真正理解您的javascript代码有关;您可以吗把更多的评论放进去,解释一下发生了什么,我可以理解它,但是最混乱的地方是你的循环中的IF块。为什么你认为这是正确的方法?但是这些变量的值会在后置中持续存在吗?我以前使用一个String数组来存储VA。虽然我相信这些问题彼此之间的关系会更好一些。回发的具体作用是什么?如果它重新加载页面,你必须重新加载
private const string pageLinkTemplateHTML = @"<a id=""pageLink{0}"" onclick=""setPage(this.id, {1});"" class=""viewLinks"">{2}</a>";
    private void BuildPaging() {
    divPages.InnerHtml = @"<table style=""width: 100%;""><tr><td style=""width: 100%"">";

    for (int i = 1; i <= Packages.Count / pageSize; i++)
        divPages.InnerHtml += string.Format(pageLinkTemplateHTML, i, i, i);

    divPages.InnerHtml += "</td></tr></table>";
}
// do the same for your other variables
var view = 'all';
function setView(id, mode) {
    view = mode;
    setHref(id);
}

function setHref(id) {
    // now you don't need to read view, sort,
    // dir and page from DOM elements, they are already there
    document.getElementById(id).href = 'ActivePackages.aspx?' + 'view=' + view + '&sort=' + sort + '&dir=' + dir + '&page=' + page;
    __doPostBack();
}

// on page load, you read the querystring from the url, check for the values and put them back into variables
window.addEventListener('load', function(){
    var query_string = {};
    var query = window.location.search.substring(1);
    var vars = query.split("&");
    for (var i=0;i<vars.length;i++) {
        var pair = vars[i].split("=");
        // If first entry with this name
        if (typeof query_string[pair[0]] === "undefined") {
            query_string[pair[0]] = decodeURIComponent(pair[1]);
            // If second entry with this name
        } else if (typeof query_string[pair[0]] === "string") {
            query_string[pair[0]] = [query_string[pair[0]],decodeURIComponent(pair[1])];
            // If third or later entry with this name
        } else {
            query_string[pair[0]].push(decodeURIComponent(pair[1]));
        }
    }
    // do the same for your other parameters
    if(query_string.hasOwnProperty('view')){
        view = query_string.view;
    }
});