2013-08-03 43 views
1

閱讀許多博客和帖子此網站後,我想試圖覆蓋RequiresUniqueEmail在SimpleMembershipProvider好像很多隻是一個繁瑣的事情一碼。RequiresUniqueEmail在SimpleMembershipProvider

所以我在尋找什麼,我也做了一些建議。我在數據庫中的電子郵件列添加了唯一索引,然後我有一個try catch塊捕獲任何sql異常。

我該用戶發佈,如果我找到它的電子郵件地址異常消息裏面的樣子,然後我返回消息說:「電子郵件已在使用」,否則另一條消息。

此工程在我的機器上,我收到錯誤消息是:

Message=Cannot insert duplicate key row in object 'dbo.UserProfile' 
with unique index 'idx_UniqueEmail'. The duplicate key value is 
([email protected]). 

由於我不是一個有經驗的程序員,我們將不勝感激的任何反饋。

我的代碼如下。

catch (SqlException e) 
{ 
     var errorMessage = e.Message.ToLower(); 
     ModelState.AddModelError("", errorMessage.Contains(model.Email) ? "Sorry the email address is already in use." : "Sorry an error has occured"); 
} 
+0

您可以在您的實體中實現IValidatableObject,並在電子郵件中存在與數據庫中已輸入的電子郵件匹配的郵件時傳回自定義錯誤。 (假設EF正在使用) –

+0

布拉德您好,感謝的答覆,我沒有使用EF這一點,但會考慮IValidatableObject –

+0

可以使用遠程驗證:http://msdn.microsoft.com/en-us/ library/gg508808(v = vs.98).aspx – ataravati

回答

0

SimpleMembershipProvider無法識別電子郵件。它實際上沒有電子郵件的概念,因爲如果您查看默認的自動生成的模式,您會注意到。這就是SimpleMembershipProvider實現不支持許多傳統MembershipProvider API的原因。

您當然可以在UserProfile表中添加一個電子郵件列(但我認爲您已經完成了),但提供者沒有實現RequiresUniqueEmail的機制,並且實際上已經硬連線以始終返回false。添加數據庫約束將在一定程度上起作用,但只有在更新配置文件時才引發異常。這並不完美,但應該工作。

你可以告訴SimpleMembershipProvider初始化提供程序時使用電子郵件作爲用戶名,但這意味着失去用戶名字段,並要求用戶與電子郵件/密碼,這可能不是最好登錄。

WebSecurity.InitializeDatabaseConnection(connectionString, "UserProfile", "UserId", "Email", true); 

另一種方法是擴展SimpleMembershipProvider,使其通知電子郵件並實現RequiresUniqueEmail。

BetterMembership.Net就以GutHub一看,正是這麼做的,並且可以用作SimpleMembershipProvider的替代品。電子郵件列是在提供商中指定的,並且它支持RequiresUniqueEmail開箱即用。

<add name="BetterProvider" 
    type="BetterMembership.Web.BetterMembershipProvider, BetterMembership, Version=1.0.1.0, Culture=neutral, PublicKeyToken=737bc70442f2c4af" 
    connectionStringName="DefaultConnection" 
    userIdColumn="UserId" 
    userNameColumn="UserName" 
    userTableName="UserProfile" 
    userEmailColumn="Email"  
    requiresUniqueEmail="true" 
    autoInitialize="true" /> 
相關問題