asp.net - ASP.NET| 复选框的“checked=true”未设置在右侧复选框中
问题描述
我正在为我正在构建的网站开发一个简单的多阶段注册页面,我让用户可以使用复选框选择他知道的程序/编程语言:
但是当我点击“下一步”按钮时,为了进入下一阶段,我选中的复选框没有设置为 true,而是复选框没有。18设置为true(虽然我没有检查它)
我确信这与这个阶段之前的阶段有关,我正在构建动态的单选按钮,用户可以在其中选择他的职业(例如艺术家、歌手等)。有 17 个单选按钮,它们以某种方式干扰了下一阶段,其中复选框的选中值仅从复选框编号开始。18 正如我之前提到的。
这是一些代码:
else if (int.Parse(ViewState["DivID"].ToString()) == 2)
{
// save the Birthday Date, Language and country of the user.
ViewState["year"] = int.Parse(DropDownYear.SelectedValue);
ViewState["month"] = int.Parse(DropDownMonth.SelectedValue);
ViewState["day"] = int.Parse(DropDownDay.SelectedValue);
ViewState["Language"] = int.Parse(langDropDown.SelectedValue);
ViewState["Country"] = int.Parse(CountryDropDown.SelectedValue);
// ---------------------------------------------
// change from part 2 of the registration to part 3
registrationP2.Visible = false;
BindProfessions(radios, Page);
registrationP3.Visible = true;
radios.Visible = true;
}
else if (int.Parse(ViewState["DivID"].ToString()) == 3)
{
// change from part 3 of the registration to part 4
ViewState["Profid"] = CheckRadio(radios);
registrationP3.Visible = false;
BindKnowledge(CheckboxCon, Page);
registrationP4.Visible = true;
CheckboxCon.Visible = true;
// ---------------------------------------------
//next.Visible = true;
}
else if(int.Parse(ViewState["DivID"].ToString()) == 4)
{
List<int> v = GetCheckBox(CheckboxCon);
ViewState["Knowids"] = GetCheckBox(CheckboxCon);
}
绑定方法:
public static void BindProfessions(HtmlControl ctrl, Page thispage)
{
List<Profession> Plist = Profession.GetProfessionList();
foreach (Profession p in Plist)
{
HtmlInputRadioButton rd_button = new HtmlInputRadioButton();
const string GROUP_NAME = "Professions";
rd_button.Name = GROUP_NAME;
string LinkID = "P" + p.ProfessionID.ToString();
rd_button.Attributes["id"] = LinkID;
RegisterUserControl userprofession = (RegisterUserControl)thispage.LoadControl("~/RegisterUserControl.ascx");
userprofession.imgP = p.ProfPath;
userprofession.fieldName = p.ProfName;
userprofession.IDnum = p.ProfessionID;
userprofession.RadioName = LinkID;
userprofession.EnableViewState = false;
rd_button.EnableViewState = false;
ctrl.Controls.Add(rd_button);
rd_button.Value = p.ProfessionID.ToString();
ctrl.Controls.Add(userprofession);
}
}
public static void BindKnowledge(HtmlControl ctrl, Page thispage)
{
List<Knowledge> Plist = Knowledge.RetKnowledgeList();
foreach (Knowledge p in Plist)
{
HtmlInputCheckBox rd_button = new HtmlInputCheckBox();
const string GROUP_NAME = "knowledge";
rd_button.Name = GROUP_NAME;
string LinkID = "Know" + p.ProgramID.ToString();
rd_button.Attributes["id"] = LinkID;
rd_button.Value = p.ProgramID.ToString();
RegisterUserControl userprofession = (RegisterUserControl)thispage.LoadControl("~/RegisterUserControl.ascx");
userprofession.imgP = p.ProgPath;
userprofession.fieldName = p.PName;
userprofession.IDnum = p.ProgramID;
userprofession.RadioName = LinkID;
userprofession.EnableViewState = false;
rd_button.EnableViewState = false;
ctrl.Controls.Add(rd_button);
ctrl.Controls.Add(userprofession);
}
}
检查收音机和复选框的方法:
public static int CheckRadio(HtmlControl ctrl)
{
try
{
int counter = 0;
int id = -1;
foreach (Control rdButton in ctrl.Controls)
{
if (rdButton is HtmlInputRadioButton)
{
HtmlInputRadioButton bu = (HtmlInputRadioButton)rdButton;
if (bu.Checked)
{
counter++;
id = int.Parse(bu.Value);
}
}
}
if (counter > 1)
{
return -1;
}
return id;
}
catch (Exception e)
{
return -1;
}
}
public static List<int> GetCheckBox(HtmlControl ctrl)
{
List<int> id_list = new List<int>();
foreach (Control rdButton in ctrl.Controls)
{
if (rdButton is HtmlInputCheckBox)
{
HtmlInputCheckBox bu = (HtmlInputCheckBox)rdButton;
if (bu.Checked)
{
id_list.Add(int.Parse(bu.Value));
}
}
}
return id_list;
}
}
调试时可以看到,如果我选择前 3 个职业,返回给我的值List<int> v
分别是 18、19 和 20 照片:debugging photo
我应该提到,在创建动态用户控件和复选框/单选按钮后,我将在受保护的 void Page_Load 中的回发时再次创建它们。
我被困了好几天,我不知道问题出在哪里,是因为 ViewState,还是我创建控件的方式......我真的不知道。
在此先感谢,伊丹。
编辑:我玩了一下,发现当我禁用我之前在 Page_load 中启动的职业绑定时,它确实可以正常工作,page load code
请查看第二个 if 语句:
protected void Page_Load(object sender, EventArgs e)
{
IsPageRefresh = false;
if (!IsPostBack)
{
ViewState["DivID"] = 1;
ViewState["postids"] = System.Guid.NewGuid().ToString();
Session["postid"] = ViewState["postids"].ToString();
}
else
{
if (ViewState["postids"].ToString() != Session["postid"].ToString())
{
IsPageRefresh = true;
}
Session["postid"] = System.Guid.NewGuid().ToString();
ViewState["postids"] = Session["postid"].ToString();
}
if (int.Parse(ViewState["DivID"].ToString()) == 3)
{
//BindProfessions(radios, Page);
}
else if(int.Parse(ViewState["DivID"].ToString()) == 4)
{
BindKnowledge(CheckboxCon, Page);
}
}
问题是我仍然需要在按下按钮后再次启动它才能获得选中的值,我该如何解决这个问题,为什么会这样?非常感谢您的帮助。出现问题是因为页面识别出我添加了 17 个新复选框,而当我检查它们时,前 17 个直到第 18 个(我检查的第一个)才被检查,最终没有检查正确复选框....
为了清楚起见,我将其他单选按钮添加到页面上的不同 div,我不知道这里发生了什么
解决方案
对于任何有同样问题的人。
我最终在 Page_PreInit() 中创建了对象,它解决了问题,建议(根据我阅读的内容)在页面发生其他任何事情之前在 Page_PreInit 中创建动态对象。
protected void Page_PreInit(object sender, EventArgs e)
{
try
{
if (!IsPostBack && Session["DivID"] == null)
{
Session["DivID"] = 1;
}
if ((int)Session["DivID"] == 3)
{
InitBindProfessions(Page);
}
else if ((int)Session["DivID"] == 4)
{
InitBindKnowledge(Page);
}
}
catch
{
Response.Redirect("HomePage.aspx");
}
}
InitBindKnowledge 和 InitBindProfessions 就像 BindKnowledge 和 BindProfession 但没有将用户控件添加到控件树
推荐阅读
- ios - UICollectionView 中的渐变单元格
- python - 如何在 CSV 文件中随机选择一定数量的行并保留其他行
- logparser - LogParser 本地计算机可能没有必要的注册表信息或消息 DLL 文件来显示消息
- php - Web.config:将带有斜杠输入的 URL 重定向到不带斜杠的 URL
- asp.net-mvc - ASP MVC 中的急切加载从导航属性返回 null
- quickbooks - Quickbooks无效的社会安全号码错误
- c# - 使用 AddAttribute 的下划线和删除线未正确更新
- php - 使用 Symfony 显示 PHP 的错误、var_dump 等
- javascript - JavaScript 文件连接问题
- c++ - 同时与两个片段着色器发生碰撞