我有一个子文件夹,它有一个aspx页面和一个web.config文件,它覆盖了根目录下web.config中的连接字符串。问题是如果aspx页面包含任何用户控件,则用户控件仍然从根目录中的web.config获取连接字符串。反正是否强迫他们使用父aspx页面使用的web.config?
答案 0 :(得分:2)
我认为您的用户控件位于根目录或没有web.config的目录中,因此他们使用root web.config。问题的原因是这个。
对于解决方案,我认为在您的页面中,您可以通过属性将连接字符串设置为其用户控件。或者,您可以让用户控件通过方法访问页面上的连接字符串。
答案 1 :(得分:1)
我猜你的用户控制用户控件实现中的某些位置直接从web.config中读取。然而,这会将信息绑定到与用户控件真正有关的用户控件。 (信息是如何获取连接字符串,而不是它自己的连接字符串)。这种约束违反了单一的责任原则,并且(间接地)导致了你的问题。而不是读取用户控件内部的连接。将连接字符串公开为属性,并在实例化控件时将页面设置为。
进一步迈向良好的设计。您的用户控件可能甚至不应该知道连接字符串,但应该有一个工作者类,或者更好的是您可能想要重写以获得用于显示目的的控件,用于重新获取数据的工作器以及用于将检索到的数据绑定到您的机制控制。
答案 2 :(得分:0)
如果它只是一个连接字符串(或只是一些设置变量),你可以从父页面将它们传递给你的控件。
在包含麻烦的用户控件的页面中,您可以在aspx页面中引用该控件,然后初始化您的aspx页面及其控件,您可以覆盖它的构造函数/自定义函数中的连接字符串
在您的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页面的连接字符串。
在您的控件中,您只需使用此覆盖连接字符串。