0

Dictionary オブジェクトのデータをカスタム ExtendedMembershipProvider の CreateUserAndAccount メソッドに渡す際に問題が発生しています。私の Account コントローラーでは、(Post) Register メソッドに次のものが含まれています。

Dictionary<string, object> userInfo = new Dictionary<string, object>();

userInfo.Add("Email", model.Email);
userInfo.Add("PasswordQuestion", model.PasswordQuestion);
userInfo.Add("PasswordAnswer", model.PasswordAnswer);

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, userInfo, true);

これにより、userInfo が入力され、カスタム プロバイダーで CreateUserAndAccount メソッドが正常に呼び出されます。

問題が 2 つあります。接続されている可能性があります。

まず、メソッドのシグネチャが同じではありません。プロバイダー メソッドは次のようになります。

public override string CreateUserAndAccount(string userName, string password, bool requireConfirmation, IDictionary<string, object> values) 

Boolean パラメータと Dictionary パラメータは切り替えられますが、メソッドにはまだ到達しています。これに一致するように Account/Register メソッドのコードを変更すると、次のようになります。

WebMatrix.WebData.WebSecurity.CreateUserAndAccount(string, string, object, bool)' に最適なオーバーロードされたメソッド マッチには、無効な引数がいくつかあります。

これがどのように発生するのか混乱しています。私の質問は、基本的に一体何が起こっているのですか?

次に、コードが CreateUserAndAccount に到達すると、渡した Dictionary オブジェクトが RouteValueDictionary に変換され、他のすべてのパラメーターが期待どおりに表示されます。

Dictionary オブジェクトを元に戻し、Email、PasswordQuestion、および PasswordAnswer の値にアクセスするにはどうすればよいですか?

4

1 に答える 1

1

staticWebSecurity.CreateUserAndAccountメソッドの署名ExtendedMembershipProvider.CreateUserAndAccountmethodの署名と一致しません。他のシグネチャを使用して 1 つのメソッドを呼び出すことはできません。これが、試行時にコンパイラ エラーが発生する理由です。

クラスのメソッドは、任意のオブジェクトを受け入れるように設計されているため、パラメーターをWebSecurity明示的に に変換しますが、メソッドはパラメーターを想定しています。propertyValuesRouteValueDictionaryExtendedMembershipProviderIDictionary<string, object>

たとえば、匿名オブジェクトを渡しても、呼び出しは引き続き機能します。

WebSecurity.CreateUserAndAccount(model.UserName, model.Password,
   new { model.Email, model.PasswordQuestion, model.PasswordAnswer },
   true);
于 2013-06-21T17:07:25.897 に答える