我正在尝试在自定义Web控件中实现提供程序模式。我仍在尝试理解模式,我有以下问题。
默认提供程序是我的控件加载时总是要使用的提供程序吗?从我可以告诉我使用的提供程序将始终是默认值,但我不确定,因为MSDN文档说,允许选择提供程序的服务器控件应该具有默认值为defaultProvider的Provider属性。对我而言,这意味着只要该提供程序位于Config文件中,控件就可以基于它的Provider属性加载给定的提供程序。那是对的吗?因此,如果未请求特定提供程序,则返回默认提供程序。
要更改提供程序,我只需更改配置文件中的defaultprovider吗? < - 我认为这是不正确的,因为这只会改变返回的defaultProvider。
这是正确的:在控件中,默认提供程序将加载到控件的OnLoad事件方法中吗? 我需要根据提供者传递来自不同来源的控制数据,但结果数据将被放入一个类中。控件将用于渲染自身。
我也很困惑如何从页面获取数据到控件? 假设我的ProviderBase有一个名为LoadData的方法
然后在我的SQLCustomerProvider中我将实现LoadData方法,可以在这里自定义此代码以读取我的特定数据并加载到类中,或者使用控件的页面是否应该将数据加载到类中?
谢谢!
答案 0 :(得分:1)
我会事先承认,我对提供者的了解仅限于为会员/个人资料/角色编写,但一般的内容仍应适用:
除非您允许开发人员指定其他提供程序,否则默认提供程序是将要使用的提供程序。
因此,以身份验证为例,如果您在web.config中有以下内容:
<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="20">
<providers>
<remove name="AspNetSqlProvider" />
<add name="SqlProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="SqlServices"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
passwordFormat="Hashed"
applicationName="/" />
<add name="AdProvider"
type="System.Web.Security.ActiveDirectoryMembershipProvider" />
</providers>
</membership>
当您在页面的某处添加Login控件时,那将使用SqlProvider。
您可以通过以下两种方式之一使用其他提供商:
方法2的一个例子是:
private void OnAuthenticate(object sender, AuthenticateEventArgs e){
bool authenticated = false;
MembershipProvider sqlProvider = Membership.Providers["SqlProvider"];
authenticated = sqlProvider.ValidateUser(Login1.UserName, Login1.Password);
if (!authenticated){
// User not found in database, try Active Directory:
MembershipProvider adProvider = Membership.Providers["AdProvider"];
authenticated = adProvider.ValidateUser(Login1.UserName, Login1.Password);
}
e.Authenticated = authenticated;
}
您可以在自己的控件上执行此操作的其他方法是公开Provider属性,并检查它是否具有值,并使用该提供程序而不是defaultProvider。
通常,提供者模型已用于为已知类提供一组默认行为 - 因此成员资格提供程序都具有(例如)返回GetUser的方法MembershipUser - AspNetSqlMembershipProvider的GetUser实现的全部目的是从ASP.NET SQL数据库加载MembershipUser数据 - 您可以在Sample Membership Provider
中看到这一点。我希望有所帮助!