如何修改Page_Load,避免Owner下拉框回发时执行loadOtherSpecimenType
解决方案:通过判断回发触发源跳过指定方法执行
我完全明白你的困扰——每次切换Owner下拉框触发回发时,Page_Load里的loadOtherSpecimenType()也会跟着执行,而你又没法修改ddlOwner_SelectedIndexChanged方法。别担心,咱们可以利用ASP.NET回发机制里的隐藏字段来精准控制方法的执行时机。
核心思路
ASP.NET在触发回发时,会把引发回发的控件ID存储在__EVENTTARGET这个表单字段里。我们只需要在Page_Load的回发分支中,检查这个字段的值是否来自ddlOwner:如果是,就跳过loadOtherSpecimenType()的执行;否则正常执行。
修改后的Page_Load代码
下面是调整后的Page_Load方法,我标注了新增的关键判断逻辑:
protected void Page_Load(object sender, EventArgs e) { //Some code here if (IsPostBack) { Console.WriteLine(""); // 新增:判断回发是否由ddlOwner触发 string eventTarget = Request.Form["__EVENTTARGET"]; // 用UniqueID确保获取到控件的完整ID(避免容器控件导致的ID前缀问题) if (!string.Equals(eventTarget, ddlOwner.UniqueID, StringComparison.Ordinal)) { loadOtherSpecimenType(); } Console.WriteLine(""); } if (!IsPostBack) { /* If (guuest){ load textboxes for DVM, Billing Owner, Copty To } else { //code below */ getDdlDVM(); getDdlBillTo(); getDdlCopyTo(); getDdlOwner(); getDdlSpecies(); var referer1 = HttpContext.Current.Request.UrlReferrer; } }
为什么这样有效?
当你选择ddlOwner的选项触发回发时,Request.Form["__EVENTTARGET"]的值会等于ddlOwner的UniqueID(如果控件在NamingContainer里,比如MasterPage或UserControl,这个ID会自动包含前缀,用UniqueID能确保匹配准确)。通过对比这个值,我们就能精准判断是否要跳过loadOtherSpecimenType()的执行。
这个方法不需要修改ddlOwner_SelectedIndexChanged方法,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Shivali Gupta
相关产品推荐
相关产品推荐

