PostBackUrl用于下拉列表

时间:2011-09-09 13:09:14

标签: c# asp.net drop-down-menu postback

在asp.net中,按钮可以有回发网址(即通过指定PostBackUrl - 我曾经使用它来截断过去的查询字符串参数 - 只需指定没有任何参数的页面网址)。使用按钮非常简单。

有谁知道这样做的最佳方法是使用下拉列表?如果我指定AutoPostBack(当选择更改时回发),似乎没有一种简单的方法来修改回发网址(即回发到没有查询字符串参数的页面)。

我猜测可能使用javascript进行自定义回发...但是有没有更好的方法 - 就像我缺少的asp.net按钮中的属性一样?

3 个答案:

答案 0 :(得分:2)

没有DropDownList属性。您可以使用Response.Redirect方法重定向用户,并使用Session collection在请求之间保留数据。

答案 1 :(得分:1)

DropDownList没有该属性,但您可以通过一些技巧将此功能添加到您的网页中。首先让我描述为什么这个属性对你来说是必要的:

  1. 您有一个网页,其中包含从数据库填充的网格视图。例如,贵公司的员工列表。这些字段是id,name,surname,jobname等。
  2. 您可以从项目的其他页面打开此页面,然后在某些情况下,您必须在gridview中选择一位员工。因此,您需要一个id为该员工的参数,您可以将其传递给gridview页面。
  3. 当然,出于此目的,您可以使用会话变量,但在某些情况下,它们不被接受。例如,会话变量对于后退按钮来说并不是那么好。您可以多次按回,从选定员工的浏览器历史记录返回到gridview页面,但会话变量将包含最后设置的ID而不是现在打开的!现在假设你有一个删除按钮,它通过会话ID完成它的工作。您会看到一个gridview行作为选定行,但删除完全不同的行。
  4. 因此,将参数传递给其他页面的最佳方法是查询字符串。您可以轻松阅读它,并确保后退按钮不会破坏它们。
  5. 现在,当您在页面上并单击gridview行时,您必须修改您的URL,以便url id参数与所选行匹配。可以使用右侧填充的PostbackUrl属性在每行中插入链接按钮来完成。单击行中的链接按钮,linkbutton包含具有正确行ID的postbackurl,回发按您的意愿进行,并且所选行和URL都可以。
  6. 现在想象你处境比较复杂。您的网页上有一个下拉列表,可以过滤您网格视图中的员工列表。例如由部门。所以你必须重新填充gridview并删除url中的id,因为在重新填充之后你不需要gridview来拥有任何选定的行。但你不能这样做,下拉列表没有这个神奇的属性......
  7. 所以这是解决方案:

    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;
            }
    
        }
    }
    

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

答案 2 :(得分:0)

如果您想直接POST到另一个页面,请使用隐藏按钮方法

<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"  />