Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 下拉列表的PostBackUrl_C#_Asp.net_Drop Down Menu_Postback - Fatal编程技术网

C# 下拉列表的PostBackUrl

C# 下拉列表的PostBackUrl,c#,asp.net,drop-down-menu,postback,C#,Asp.net,Drop Down Menu,Postback,在asp.net中,按钮可以具有回发url(即通过指定回发url-我过去曾使用过它来截断querystring参数-通过只指定页面url而不指定任何参数)。这是一个超级简单的按钮 有人知道用下拉列表做这件事的最好方法是什么吗?如果我指定AutoPostBack(选择更改时回发),那么修改回发url(即回发到没有querystring参数的页面)似乎不是一个简单的方法 我猜也许用javascript做一个自定义回发。。。但是有没有更好的方法?比如我缺少的asp.net按钮中的属性?没有DropDo

在asp.net中,按钮可以具有回发url(即通过指定回发url-我过去曾使用过它来截断querystring参数-通过只指定页面url而不指定任何参数)。这是一个超级简单的按钮

有人知道用下拉列表做这件事的最好方法是什么吗?如果我指定AutoPostBack(选择更改时回发),那么修改回发url(即回发到没有querystring参数的页面)似乎不是一个简单的方法


我猜也许用javascript做一个自定义回发。。。但是有没有更好的方法?比如我缺少的asp.net按钮中的属性?

没有DropDownList属性。您可以使用
响应重定向用户。重定向
方法和使用
会话收集
在请求之间保存数据。

如果您想直接发布到另一页,可以使用隐藏按钮方法

<asp:DropDownList ID="lstMyDropDown" runat="server"  ClientIDMode="Static" onchange="javascript:$get('btnHidden').click(); ">
    <asp:ListItem Value="0" Text="Some Value 1" />
    <asp:ListItem Value="1" Text="Some Value 2" />
</asp:DropDownList>
<asp:Button ID="btnHidden" runat="server" ClientIDMode="Static" PostBackUrl="~/myProcessingPage.aspx" OnClientClick="javascript:if($get('lstPrinterModel').selectedIndex < 1){return false;}" style="display:none"  />

DropDownList没有该属性,但您可以使用一些技巧将此功能添加到页面中。首先,请允许我描述一种情况,说明为什么您可能需要该物业:

  • 您得到了一个包含从数据库填充的gridview的页面。例如,您公司的员工列表。字段包括id、姓名、姓氏、职务名称等
  • 您可以从项目的其他页面打开此页面,在某些情况下,您必须在gridview中选择一名员工。因此,您需要一个id为该员工的参数,可以将其传递到gridview页面
  • 当然,出于这个目的,您可以使用会话变量,但在某些情况下,它们是不被接受的。例如,会话变量不能很好地使用后退按钮。您可以多次按back键,从浏览器历史记录中返回gridview页面,选择employee,但会话变量将包含上次设置的id,而不是现在打开的id!现在,假设您有一个删除按钮,该按钮根据会话id执行其工作。您看到一个gridview行作为所选行,但删除了一个完全不同的行
  • 因此,向其他页面传递参数的最佳方法是查询字符串。您可以轻松阅读,并确保后退按钮不会破坏它们
  • 现在,当您在页面上单击gridview行时,您必须修改url,以便url id参数与所选行匹配。这可以通过在每一行中插入带有右填充PostbackUrl属性的链接按钮来完成。单击行中的链接按钮,该链接按钮包含具有正确行id的回发url,回发按照您的意愿进行,并且所选行和url都正常
  • 现在想象一下,你处于更复杂的情况。您的页面上有一个下拉列表,可以过滤gridview中的员工列表。例如按部门划分。因此,您必须重新填充gridview并删除url中的id,因为在重新填充之后,您不需要gridview来拥有任何选定的行。但是你做不到,dropdownlist没有这个神奇的属性
  • 因此,解决方案如下:

    namespace myspace
    {
        public partial class EmployeePage : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                //now you should get the correct url
                //you can generate it right here but i prefer to use a special method to
                //ensure that this url will be the same in all places of my code
                string emptyEmpIdPostbackUrl = Utils.GetEmployeePageURL("");
    
                //now call the main method
                Utils.CreatePostbackUrl(this, "SetFilterUrl", emptyEmpIdPostbackUrl,
                    new List<WebControl> { ddlFilterCompany, ddlFilterDepartment, ddlFilterOwner, 
                        ddlFilterType, ddlFilterDiscarded, ddlFilterChangeDate });
    
                if (!IsPostBack)
                {
                    ...
                }
           }
    
           ...
    
        }   
        public static class Utils
        {
            //page - your gridview page
            //name - some custom name to ensure that different postbacks will work independently from each other
            //url - the url with empty employee id
            //controls - list of webcontrols for which you want to create postback url (i've got 6 dropdownlists on my own page)
            public static void CreatePostbackUrl(Page page, string name, string url, List<WebControl> controls)
            {
                //create a hidden button with your postbackurl
                Button btn = new Button();
                btn.ID = name;
                btn.PostBackUrl = url;
                btn.Attributes.Add("style", "display: none;");
                page.Form.Controls.Add(btn);
    
                //register javascript that will simulate click on the hidden button
                page.ClientScript.RegisterClientScriptBlock(page.GetType(), name + "Script",
                    "<script type=\"text/javascript\"> function " + name + "() {" +
                    "var btn = document.getElementById('" + btn.ClientID + "'); " +
                    "if (btn) btn.click();} </script>", false);
    
                //and link this script to each dropdownlist in the list
                foreach (WebControl ctrl in controls)
                {
                    string attrName = "";
    
                    if (ctrl is DropDownList)
                        attrName = "onchange";
    
                    if (attrName != "")
                        ctrl.Attributes.Add(attrName, name + "()");
                }
    
            }
    
            public static string GetEmployeePageURL(string empId)
            {
                return "emp.aspx" +
                    "?empid=" + empId;
            }
    
        }
    }
    
    名称空间myspace
    {
    公共部分类EmployeePage:System.Web.UI.Page
    {
    受保护的无效页面加载(对象发送方、事件参数e)
    {
    //现在您应该获得正确的url了
    //您可以在这里生成它,但我更喜欢使用特殊的方法
    //确保此url在我的代码的所有位置都相同
    字符串emptyEmpIdPostbackUrl=Utils.GetEmployeePageURL(“”);
    //现在调用main方法
    Utils.CreatePostbackUrl(这是“SetFilterUrl”,emptyEmpIdPostbackUrl,
    新列表{ddlpiltercompany,ddlpilterdepartment,ddlpilterowner,
    ddlpiltertype,ddlpilterdiscared,ddlpilterchangedate});
    如果(!IsPostBack)
    {
    ...
    }
    }
    ...
    }   
    公共静态类Utils
    {
    //页面-您的gridview页面
    //名称-一些自定义名称,以确保不同的回发将彼此独立工作
    //url-员工id为空的url
    //控件-要为其创建回发url的网络控件列表(我在自己的页面上有6个下拉列表)
    公共静态void CreatePostbackUrl(页面、字符串名称、字符串url、列表控件)
    {
    //使用postbackurl创建隐藏按钮
    按钮btn=新按钮();
    btn.ID=名称;
    btn.PostBackUrl=url;
    添加(“样式”,“显示:无;”);
    page.Form.Controls.Add(btn);
    //注册将模拟单击隐藏按钮的javascript
    page.ClientScript.RegisterClientScriptBlock(page.GetType(),name+“Script”,
    函数“+name+”(){”+
    “var btn=document.getElementById(“+btn.ClientID+”)+
    “if(btn)btn.click();}”,false);
    //并将此脚本链接到列表中的每个下拉列表
    foreach(控件中的WebControl ctrl)
    {
    字符串attrName=“”;
    如果(ctrl为下拉列表)
    attrName=“onchange”;
    如果(attrName!=“”)
    ctrl.Attributes.Add(attrName,name+“()”);
    }
    }
    公共静态字符串GetEmployeePageURL(字符串empId)
    {
    返回“emp.aspx”+
    “?empid=“+empid;
    }
    }
    }
    

    在这些操作之后,您将获得一个隐藏按钮和一组网络控件的页面,这些控件将链接到此按钮并共享其PostBackUrl属性。

    也许有更好的方法,您想实现什么?更好/最好的模型是像最初的ASP.NET webforms模型那样取消完整的回发。当然,您应该使用AJAX/JQuery来获得您想要的东西