Каков наилучший способ получить значение моего элемента управления в OnInit ()? - PullRequest
2 голосов
/ 23 февраля 2010

Я недавно прочитал эту статью об умном использовании ViewState и особенно заинтересован в отсутствии ненужных статических данных во ViewState. Однако мне также любопытно, могу ли я сделать то же самое для выпадающего списка «родитель-потомок», как классический пример Country / CountrySubDivision.

Итак, у меня есть эта разметка:

    <asp:DropDownList runat="server" ID="ddlCountry" DataTextField="Name" DataValueField="ID" EnableViewState="false" />
    <asp:DropDownList runat="server" ID="ddlCountrySubdivision" DataTextField="Name" DataValueField="ID" EnableViewState="false" />
    <asp:Button runat="server" ID="btnTest" />

И этот код:

    public class Country
    {
        public string Name { get; set;}
        public int Id { get; set; }
    }

    public class CountrySubdivision
    {
        public string Name { get; set; }
        public int Id { get; set; }
        public int CountryId { get; set; }
    }

    protected override void OnInit(EventArgs e)
    {
        var l = new List<Country>();
        l.Add(new Country { Name = "A", Id = 1 });
        l.Add(new Country { Name = "B", Id = 2 });
        l.Add(new Country { Name = "C", Id = 3 });
        ddlCountry.DataSource = l;
        ddlCountry.DataBind();

        var l2 = new List<CountrySubdivision>();
        l2.Add(new CountrySubdivision { Name = "A1", Id = 1, CountryId = 1 }); 
        l2.Add(new CountrySubdivision { Name = "A2", Id = 2, CountryId = 1 });
        l2.Add(new CountrySubdivision { Name = "B1", Id = 4, CountryId = 2 });
        l2.Add(new CountrySubdivision { Name = "B2", Id = 5, CountryId = 2 });
        l2.Add(new CountrySubdivision { Name = "C1", Id = 7, CountryId = 3 });
        l2.Add(new CountrySubdivision { Name = "C2", Id = 8, CountryId = 3 });

        // this does not work: always comes out 1 regardless of what's actually selected
        var selectedCountryId = string.IsNullOrEmpty(ddlCountry.SelectedValue) ? 1 : Int32.Parse(ddlCountry.SelectedValue);

        // this does work: 
        var selectedCountryIdFromFormValues = Request.Form["ddlCountry"];

        ddlCountrySubdivision.DataSource = l2.Where(x => x.CountryId == selectedCountryId).ToList();
        ddlCountrySubdivision.DataBind();

        base.OnInit(e);
    }

Итак, первое, что я заметил, это то, что даже когда EnableViewstate равно false, значение контроля моей страны сохраняется в запросах без каких-либо дополнительных усилий. Милая. Это много сериализованных вещей, которые мне не нужно отправлять по проводам при отправке форм.

Затем я пришел к приведенному выше примеру с парой раскрывающихся списков родитель-потомок, и я вижу, что ddlCountry.SelectedValue является дефолтом, тогда как Request.Form["ddlCountry"] отражает значение элемента управления.

Есть ли способ сохранить EnableViewState = "false", не прибегая к Request.Form, чтобы получить значение зависимого элемента управления?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2010

Из-за жизненного цикла страницы ASP.NET

У вас будет доступ к вновь выбранному значению в методе OnSelectedIndexChanged в ddlCountry.

Request.Form["ddlCountry"] - это старый школьный способ (классический ASP) для получения выбранного значения, но если вы используете WebForms, возможно, вам будет проще просто следовать жизненному циклу страницы. Я обнаружил, что WebForms немного странно изначально исходят от классического ASP, но как только вы поймете жизненный цикл страницы, все будет не так плохо.

2 голосов
/ 23 февраля 2010

Затем я пришел к приведенному выше примеру с парой выпадающих родительских и дочерних элементов и вижу, что ddlCountry.SelectedValue имеет значение по умолчанию, тогда как Request.Form ["ddlCountry"] отражает значение элемента управления.

Причина, по которой вы наблюдаете такое поведение, заключается в том, что в тот момент жизненного цикла страницы Viewstate не был загружен. Когда Viewstate загружено, оно берется из значений объекта Request.Form, поэтому вы видите там правильные значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...