代码之家  ›  专栏  ›  技术社区  ›  jhunter

web.config覆盖不影响用户控件

  •  1
  • jhunter  · 技术社区  · 15 年前

    我有一个子文件夹,其中有一个aspx页面和一个web.config文件,该文件覆盖根目录中web.config中的连接字符串。问题是,如果ASPX页包含任何用户控件,则用户控件仍然从根目录中的web.config获取连接字符串。是否仍要强制它们使用父ASPX页使用的web.config?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Canavar    15 年前

    我假设您的用户控件位于根目录或没有web.config的目录中,因此它们使用根web.config。问题的原因是这个。

    对于解决方案,我认为在您的页面中,可以通过属性将连接字符串设置为其用户控件。或者您可以让您的用户控件通过一个方法访问页面上的连接字符串。

        2
  •  1
  •   Rune FS    15 年前

    我猜您的用户控制着用户控件实现中直接从web.config读取的一些地方。但是,它将信息绑定到与用户控件真正相关的用户控件。(信息是如何获取连接字符串,而不是它本身的连接字符串)。这种绑定违反了单一责任原则,并且(间接地)导致了您的问题。而不是读取用户控件内的连接。将连接字符串公开为属性,并在实例化控件时让页对其进行设置。

    让它更进一步地进入行为良好的设计。您的用户控件可能甚至不知道连接字符串,而是应该有一个worker类,或者更好,您可能希望重写以具有用于显示的控件、用于检索数据的worker以及用于将检索到的数据绑定到控件的机制。

        3
  •  0
  •   dan richardson    15 年前

    如果只是一个连接字符串(或者只是几个设置变量),您可以从父页面将它们传递给您的控件。

    在包含问题用户控件的页面中,可以引用ASPX页面中的控件,然后在初始化ASPX页面及其控件时,可以重写其Contractor/Custom函数中的连接字符串。

    在您的ASPX页面中

    <%Reference Src="path/to/your/control"%>
    

    代码端(ASPX)

    // - check if this works first
    ASP.class_name_of_control_ascx(override_connection_string); 
    
    // Other wise - created place holder on page for control/find control on page
    UserControl ctrl = new ASP.class_name_of_control_ascx();
    PlaceHolderOnPage.Controls.Add(ctrl);
    ((ASP.class_name_of_control_ascx)ctrl).RunMethod(override_connection string);
    

    然后在控制端,只需设置默认的构造函数和重写构造函数来接受来自父ASPX页的连接字符串。

    在您的控件中,您将只使用这个覆盖连接字符串。