2013-06-21 4 views
0

Dictionary 개체의 데이터를 사용자 지정 ExtendedMembershipProvider의 CreateUserAndAccount 메서드로 전달하는 데 문제가 있습니다. 사용자 정보를 채우고 성공적으로 내 사용자 지정 공급자의 CreateUserAndAccount 메소드를 호출MVC 4가 Dictionary를 RouteValueDictionary로 변환합니다.

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); 

: 내 계정 컨트롤러에서 (포스트) 등록 방법은 다음있다.

두 가지가있을 수 있습니다 - 문제가있을 수 있습니다.

첫째, 메소드 서명이 동일하지 공급자 방법은 다음과 같다 : 부울 및 사전 매개 변수를 전환되지만, 방법은 아직 도달

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

. 나는이 일치하도록 계정/등록 방법의 코드를 변경하면 내가 얻을 :

WebMatrix.WebData.WebSecurity.CreateUserAndAccount에 가장 적합한 오버로드 된 메서드 (문자열, 문자열, 개체, 부울) '일부를 가지고 잘못된 인수.

어떻게 이런 일이 발생할 수 있는지 혼란 스럽습니다. 제 질문은 근본적으로 무슨 일입니까?

두 번째로 코드가 CreateUserAndAccount에 도달하면 전달 된 Dictionary 개체가 RouteValueDictionary로 변환되고 다른 모든 매개 변수가 예상대로 나타납니다.

어떻게 내 사전 개체를 다시 가져 와서 Email, PasswordQuestion 및 PasswordAnswer 값에 액세스 할 수 있습니까?

답변

1

the static WebSecurity.CreateUserAndAccount method의 서명이 the ExtendedMembershipProvider.CreateUserAndAccount method의 서명과 일치하지 않습니다. 다른 메소드의 서명을 사용하여 하나의 메소드를 호출 할 수 없으므로, 시도 할 때 컴파일러 오류가 발생합니다. ExtendedMembershipProvider 방법은 IDictionary<string, object> 매개 변수를 예상하는 반면이, 모든 개체를 수용하도록 설계 되었기 때문에

WebSecurity 클래스의 방법은 명시 적으로 RouteValueDictionarypropertyValues 매개 변수를 변환합니다.

예를 들어, 당신은 익명의 객체를 전달할 수 있으며, 전화는 여전히 작동합니다 :

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, 
    new { model.Email, model.PasswordQuestion, model.PasswordAnswer }, 
    true); 
+0

감사 리차드, 좋은 대답. TBH 나는 긴 코딩 세션의 끝을 보았다. –

관련 문제