PostBackUrl для выпадающего списка - PullRequest
2 голосов
/ 09 сентября 2011

В asp.net кнопки могут иметь URL-адреса обратной передачи (т. Е. Указав PostBackUrl - я использовал это для обрезания параметров строки запроса в прошлом - просто указав URL-адрес страницы без каких-либо параметров).Это очень просто с помощью кнопки.

Кто-нибудь знает, как лучше всего это сделать с помощью выпадающего списка?Если я укажу AutoPostBack (отправлять обратно при изменении выбора), то, похоже, не будет простого способа изменить URL-адрес обратной передачи (т. Е. Отправить обратно на страницу без параметров строки запроса).

Я предполагаю, что, возможно,делать пользовательский постбэк с javascript ... но есть ли лучший способ - например, свойство, как в кнопке asp.net, которое мне не хватает?

Ответы [ 3 ]

2 голосов
/ 09 сентября 2011

Нет, свойства DropDownList отсутствуют. Вы можете перенаправить пользователя с помощью метода Response.Redirect и использовать Session collection для сохранения данных между запросами.

1 голос
/ 28 января 2015

Для DropDownList этого свойства нет, но вы можете сделать несколько трюков, чтобы добавить эту функцию на свои страницы.Прежде всего позвольте мне описать ситуацию, почему вам может понадобиться это свойство:

  1. У вас есть страница с сеткой, заполненной из базы данных.Например, список сотрудников вашей компании.Поля: id, имя, фамилия, имя работы и т. Д.
  2. Вы можете открыть эту страницу с других страниц вашего проекта, а затем в некоторых случаях вам нужно выбрать одного из ваших сотрудников в сетке.Поэтому вам нужен параметр с идентификатором этого сотрудника, который вы можете передать на страницу gridview.
  3. Конечно, для этих целей вы можете использовать переменные сеанса, но в некоторых случаях они не принимаются.Например, переменные сессии не очень хороши с кнопкой возврата.Вы можете многократно нажимать назад, возвращаться на страницу сетки в истории браузера с выбранным сотрудником, но переменная сеанса будет содержать последний установленный идентификатор, а не открытый сейчас!А теперь представьте, что у вас есть кнопка удаления, которая выполняет свою работу по идентификатору сеанса.Вы видите одну строку сетки в качестве выбранной, но удаляете совершенно другую строку.
  4. Таким образом, лучший способ передачи параметров на другие страницы - это строка запроса.Вы можете прочитать его с легкостью и быть уверенным, что кнопка «Назад» не уничтожит их.
  5. Теперь, когда вы находитесь на странице и щелкаете по строкам сетки, вам нужно изменить ваш URL, чтобы соответствовать параметру url id.выбранная строка.Это можно сделать с помощью кнопок ссылок, вставленных в каждую строку с заполненным справа свойством PostbackUrl.Вы нажимаете кнопку ссылки в строке, кнопка ссылки содержит postbackurl с правильным идентификатором строки, postback идет так, как вы хотите, и с выбранной строкой и URL-адресом все в порядке.
  6. А теперь представьте, что вы находитесь вболее сложная ситуация.У вас есть выпадающий список на вашей странице, который должен фильтровать список сотрудников в вашем gridview.Например по отделам.Таким образом, вы должны заново заполнить сетку и избавиться от идентификатора в URL, потому что после добавления вам не нужно, чтобы сетка имела какие-либо выбранные строки.Но вы не можете этого сделать, выпадающий список не имеет этого магического свойства ...

Итак, вот решение:

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

    }
}

После этих манипуляций выполучите страницу со скрытой кнопкой и набором веб-элементов управления, которые будут связаны с этой кнопкой, и поделитесь свойством PostBackUrl.

0 голосов
/ 08 июля 2014

Если вы хотите отправить 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"  />
...