Я недавно прочитал эту статью об умном использовании 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
, чтобы получить значение зависимого элемента управления?