WebForms:引用动态控件
WebForms: Reference dynamic control
我有一个在页面上生成动态 select 元素的 WebForms 应用程序。我不知道会出现多少,因为那是基于数据库中有多少条记录。这是在 Page_Load 上执行的部分代码。
foreach (int studioId in studioIds)
{
DataRow studio = DAL.Database.Object_Get(Database.ObjectType.Studio, studioId).Rows[0];
var studioName = studio["name"].ToString();
string literal = string.Format("<div class=\"form-group\">" +
"<label for=\"team_filter_{0}\" class=\"col-md-3 control-label text-nowrap\">{1}</label>" +
"<select id=\"team_filter_{0}\" class=\"col-md-9\" multiple=\"true\">" +
"<option value=\"studio_{0}\" data-type=\"studio\">All {1}</option>", studioId, studioName);
// ...
literal += "<optgroup label=\"Games\">";
literal += "<option value=\"game_0\" data-type=\"game\">All Games</option>";
literal += "</optgroup>";
literal += "</select>" +
"</div>";
filterselectors.Controls.Add(new LiteralControl(literal));
如果您查看 select 元素,我会生成一个 ID(即 team_filter_1、team_filter_2)并附加数据库记录的主键。
在同一页面上,我有一个按钮调用以下方法来处理 select 列表中选中的选项(我使用 Bootstrap multiselect 插件)。
private bool GenerateFinancialReport()
{
HtmlSelect select = (HtmlSelect)Page.FindControl("team_filter_???");
QueryDropDown(select, DAL.Database.ObjectType.Game, out games, out gameNames);
// ...
}
我有两个问题,我必须引用所有 select 元素,但我不知道它们的 ID。其次,我认为我不能使用 FindControl 方法,因为这不是服务器控件。我在上面对 FindControl 的调用中尝试了硬编码 "team_filter_1",但 select 变量始终为 null。
我也试过像下面这样在代码隐藏中使用服务器控件,但我仍然遇到同样的问题。当页面回发时,我无法在代码隐藏中引用下拉列表:
foreach (int studioId in studioIds)
{
DataRow studio = DAL.Database.Object_Get(Database.ObjectType.Studio, studioId).Rows[0];
var studioName = studio["name"].ToString();
// Start
Panel formGroup = new Panel();
formGroup.Attributes.Add("class", "form-group");
Label label = new Label();
label.Attributes.Add("for", "team_filter_" + studioId);
label.Attributes.Add("class", "col-md-3 control-label text-nowrap");
label.Text = studioName;
HtmlSelect teamfilter = new HtmlSelect();
teamfilter.ID = "team_filter_" + studioId;
teamfilter.Attributes.Add("class", "col-md-9");
teamfilter.Attributes.Add("multiple", "true");
ListItem listItem = new ListItem("All " + studioName, "studio_" + studioId);
listItem.Attributes.Add("data-type", "studio");
teamfilter.Items.Add(listItem);
listItem = new ListItem("All Games", "game_0");
listItem.Attributes.Add("data-type", "game");
teamfilter.Items.Add(listItem);
formGroup.Controls.Add(label);
formGroup.Controls.Add(teamfilter);
filterselectors.Controls.Add(formGroup);
您将无法从服务器检索数据,尤其是因为您没有使用服务器控件。我相信最好(即最简单、最简单)的选择可能是通过 javascript 获取 ID,然后通过 ASP.NET Web API 控制器或通过粘贴逗号分隔的 ID 列表到 ASP 隐藏输入字段。
Javascript 获取选项值并存储它们对于 bootstrap 多选插件来说就像这样:
var selectedIDs = [];
var stringVal = '';
$('div.form-group ul.multiselect-container.dropdown-menu li.active').each(function(i){
selectedIDs.push($(this).attr('value'));
});
stringVal = selectedIDs.join();
$('#myHiddenField').val(stringVal);
我有一个在页面上生成动态 select 元素的 WebForms 应用程序。我不知道会出现多少,因为那是基于数据库中有多少条记录。这是在 Page_Load 上执行的部分代码。
foreach (int studioId in studioIds)
{
DataRow studio = DAL.Database.Object_Get(Database.ObjectType.Studio, studioId).Rows[0];
var studioName = studio["name"].ToString();
string literal = string.Format("<div class=\"form-group\">" +
"<label for=\"team_filter_{0}\" class=\"col-md-3 control-label text-nowrap\">{1}</label>" +
"<select id=\"team_filter_{0}\" class=\"col-md-9\" multiple=\"true\">" +
"<option value=\"studio_{0}\" data-type=\"studio\">All {1}</option>", studioId, studioName);
// ...
literal += "<optgroup label=\"Games\">";
literal += "<option value=\"game_0\" data-type=\"game\">All Games</option>";
literal += "</optgroup>";
literal += "</select>" +
"</div>";
filterselectors.Controls.Add(new LiteralControl(literal));
如果您查看 select 元素,我会生成一个 ID(即 team_filter_1、team_filter_2)并附加数据库记录的主键。
在同一页面上,我有一个按钮调用以下方法来处理 select 列表中选中的选项(我使用 Bootstrap multiselect 插件)。
private bool GenerateFinancialReport()
{
HtmlSelect select = (HtmlSelect)Page.FindControl("team_filter_???");
QueryDropDown(select, DAL.Database.ObjectType.Game, out games, out gameNames);
// ...
}
我有两个问题,我必须引用所有 select 元素,但我不知道它们的 ID。其次,我认为我不能使用 FindControl 方法,因为这不是服务器控件。我在上面对 FindControl 的调用中尝试了硬编码 "team_filter_1",但 select 变量始终为 null。
我也试过像下面这样在代码隐藏中使用服务器控件,但我仍然遇到同样的问题。当页面回发时,我无法在代码隐藏中引用下拉列表:
foreach (int studioId in studioIds)
{
DataRow studio = DAL.Database.Object_Get(Database.ObjectType.Studio, studioId).Rows[0];
var studioName = studio["name"].ToString();
// Start
Panel formGroup = new Panel();
formGroup.Attributes.Add("class", "form-group");
Label label = new Label();
label.Attributes.Add("for", "team_filter_" + studioId);
label.Attributes.Add("class", "col-md-3 control-label text-nowrap");
label.Text = studioName;
HtmlSelect teamfilter = new HtmlSelect();
teamfilter.ID = "team_filter_" + studioId;
teamfilter.Attributes.Add("class", "col-md-9");
teamfilter.Attributes.Add("multiple", "true");
ListItem listItem = new ListItem("All " + studioName, "studio_" + studioId);
listItem.Attributes.Add("data-type", "studio");
teamfilter.Items.Add(listItem);
listItem = new ListItem("All Games", "game_0");
listItem.Attributes.Add("data-type", "game");
teamfilter.Items.Add(listItem);
formGroup.Controls.Add(label);
formGroup.Controls.Add(teamfilter);
filterselectors.Controls.Add(formGroup);
您将无法从服务器检索数据,尤其是因为您没有使用服务器控件。我相信最好(即最简单、最简单)的选择可能是通过 javascript 获取 ID,然后通过 ASP.NET Web API 控制器或通过粘贴逗号分隔的 ID 列表到 ASP 隐藏输入字段。
Javascript 获取选项值并存储它们对于 bootstrap 多选插件来说就像这样:
var selectedIDs = [];
var stringVal = '';
$('div.form-group ul.multiselect-container.dropdown-menu li.active').each(function(i){
selectedIDs.push($(this).attr('value'));
});
stringVal = selectedIDs.join();
$('#myHiddenField').val(stringVal);