1

我正在尝试在自定义 Web 控件中实现提供者模式。我仍在尝试理解这种模式,并且我有以下问题。

默认提供程序是我的控件加载时始终使用的提供程序吗?据我所知,使用的提供程序将始终是默认值,但我不确定,因为 MSDN 文档说允许选择提供程序的服务器控件应具有应默认为 defaultProvider 值的 Provider 属性。对我来说,这意味着控件可以根据它的 Provider 属性加载给定的提供者,只要该提供者在配置文件中。那是对的吗?因此,如果未请求特定提供者,则返回默认提供者。

要更改提供程序,我是否只需更改配置文件中的默认提供程序?<-- 我认为这是不正确的,因为这只会更改返回的 defaultProvider。

这是否正确:在控件中,默认提供程序将在控件的 OnLoad 事件方法中加载?我需要根据提供者从不同的来源传递控制数据,但结果数据将被放入一个类中。控件将用于呈现自身。

我也很困惑如何从页面获取数据到控件?假设我的 ProviderBase 有一个名为 LoadData 的方法

然后在我的 SQLCustomerProvider 中,我将实现 LoadData 方法,是否可以在此处自定义此代码以读取我的特定数据并加载到类中,或者使用控件的页面是否应该将数据加载到类中?

谢谢!

4

1 回答 1

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>

当您在页面的某处添加登录控件时,它将使用 SqlProvider。

您可以通过以下两种方式之一使用不同的提供程序:

  1. 您可以使用Login 控件的MembershipProvider属性指定不同的提供程序
  2. 您可以提供在登录控件身份验证事件上调用的方法,您可以在其中选择您的提供程序。

方法 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。

通常,提供者模型已用于为已知类提供一组默认行为 - 因此成员资格提供者都有(例如)返回MembershipUser的方法GetUser - AspNetSqlMembershipProvider 的 GetUser 实现的全部目的是加载来自 ASP.NET SQL 数据库的 MembershipUser 数据 - 您可以在Sample Membership Provider中看到这一点

我希望这会有所帮助!

于 2009-07-28T20:57:07.080 回答