Предотвращение создания пользовательского ASP DropDownList для перезагрузки страницы до запуска события OnSelectedIndexChanged - PullRequest
0 голосов
/ 11 апреля 2020

Я dotnet разработчик, который недавно работал с User Control s. Я работаю со старой веб-платформой, которая использует User Control в проекте панели администратора.

У нас есть custom DropDownList, который не наследуется от базового DropDownList элемента управления Microsoft , Он создает некоторые другие элементы управления помимо базового DropDownList и добавляет два других элемента управления в качестве своих дочерних элементов.

Теперь у меня есть идея использовать несколько DropDownList, относящихся друг к другу. В более ясном виде я хочу, чтобы пользователь выбрал страну из # 1 DropDownList, а мои Control загружают города в # 2 DropDownList БЕЗ ЛЮБОЙ ПЕРЕЗАГРУЗКИ СТРАНИЦ * .

Здесь Мой пользовательский класс:

[ToolboxData("<{0}:FormItemDropDownList runat=\"server\"></{0}:FormItemDropDownList>")]
public class FormItemDropDownList : CustomPanel
{
    Base.DropDownList lstInput = new Base.DropDownList();

    public string Lable { get; set; }
    public string ResourceKey { get; set; }
    public string Note { get; set; }
    public string FileSelectionPath { get; set; } = string.Empty;
    public string InvalidValues { get; set; } = string.Empty;

    public string Identifier
    {
        get
        {
            EnsureChildControls();
            return lstInput.Identifier;
        }
        set
        {
            EnsureChildControls();
            lstInput.Identifier = value;
        }
    }

    public bool AutoPostBack
    {
        get
        {
            EnsureChildControls();
            return lstInput.AutoPostBack;
        }
        set
        {
            EnsureChildControls();
            lstInput.AutoPostBack = value;
        }
    }
    public string CssClass
    {
        get
        {
            EnsureChildControls();
            return lstInput.CssClass;
        }
        set
        {
            EnsureChildControls();
            lstInput.CssClass = value;
        }
    }
    public bool Enabled
    {
        get
        {
            EnsureChildControls();
            return lstInput.Enabled;
        }
        set
        {
            EnsureChildControls();
            lstInput.Enabled = value;
        }
    }
    public ListItemCollection Items
    {
        get
        {
            EnsureChildControls();
            return lstInput.Items;
        }
    }
    public int SelectedIndex
    {
        get
        {
            EnsureChildControls();
            return lstInput.SelectedIndex;
        }
        set
        {
            EnsureChildControls();
            lstInput.SelectedIndex = value;
        }
    }
    public System.Web.UI.WebControls.ListItem SelectedItem
    {
        get
        {
            EnsureChildControls();
            return lstInput.SelectedItem;
        }
    }
    public string SelectedValue
    {
        get
        {
            EnsureChildControls();
            return lstInput.SelectedValue;
        }
        set
        {
            EnsureChildControls();
            lstInput.SelectedValue = value;
        }
    }
    public string SetIndexByValue
    {
        set
        {
            EnsureChildControls();
            lstInput.SelectedIndex = lstInput.Items.IndexOf(lstInput.Items.FindByValue(value));
        }
    }

    public event EventHandler SelectedIndexChanged
    {
        add
        {
            EnsureChildControls();
            lstInput.SelectedIndexChanged += value;
        }
        remove
        {
            EnsureChildControls();
            lstInput.SelectedIndexChanged -= value;
        }
    }

    public override void Focus()
    {
        // base.Focus();
        lstInput.Focus();
    }

    protected override void OnInit(EventArgs e)
    {
        Identifier = Guid.NewGuid().ToString();
        this.Controls.Add(lstInput);

        base.OnInit(e);
    }

    protected override void OnPreRender(EventArgs e)
    {
        if (string.IsNullOrWhiteSpace(Lable))
            Lable = WebTools.Utility.Resource.GetResource(ResourceKey);

        ChildControlsPatern = "[DropDownListControl]";
        TemplatePathKey = "FormItemDropDownListTemplatePath";
        HintTemplatePathKey = "FormHintTemplatePath";
        TemplateValueArray = new object[] { Lable, Note, Error, GetHintSource(ResourceKey) };

        base.OnPreRender(e);
    }
}

Это мои элементы просмотра:

<asp:UpdatePanel runat="server" ID="updPanel" UpdateMode="Always">
<ContentTemplate>
    <custom:FormItemDropDownList runat="server" CssClass="" ID="cdrpCountryLocation" InvalidValues=",255," OnSelectedIndexChanged="cdrpLocation_SelectedIndexChanged" AutoPostBack="true" />
    <custom:FormItemDropDownList runat="server" CssClass="" ID="cdrpProvinceLocation" InvalidValues=",255," OnSelectedIndexChanged="cdrpLocation_SelectedIndexChanged" AutoPostBack="true" Enabled="false" />
</ContentTemplate>
<Triggers>
    <asp:AsyncPostBackTrigger ControlID="cdrpCountryLocation" EventName="SelectedIndexChanged" />
    <asp:AsyncPostBackTrigger ControlID="cdrpProvinceLocation" EventName="SelectedIndexChanged" />
</Triggers>

А вот мой обработчик событий:

protected void cdrpLocation_SelectedIndexChanged(object sender, EventArgs e)
    {
        Base.DropDownList dropDownControl = (Base.DropDownList) sender;

        long parentId = Convert.ToInt64(dropDownControl.SelectedItem.Value);

        if (dropDownControl.Identifier == cdrpCountryLocation.Identifier)
            // This is a private method which prepare child dropdownlist items
            _fillLocationDropDownBasedOnType(cdrpProvinceLocation, 0, parentId);
    }

Это моя процедура. Как вы видели, я использовал UpdatePanel для желаемого поведения. Но невероятно, как только я выбираю любую опцию в любых случаях пользовательских DropDownLists, страница перезагружается, без каких-либо AJAX запросов на странице.

Я пробовал много способов на форумах, никто не мог мне помочь в этой безумной проблеме. И это второй день, когда я не достиг никаких результатов.

Я также пробую этот метод с классом DropDownList чистого Microsoft на той же странице. Он работает как брелок и отправляет AJAX XHR запрос на управление. Но с моим пользовательским DropDownList элементом управления страница перезагружается перед отправкой любых XHR s.

...