MVC 3 ASP.Net アプリケーションで独自のプロファイル プロバイダーを使用しています。このブログのように、ProfileBase クラスを使用して実装しました。
私の問題は、「BlogSpace」と呼ばれる一意のプロパティがあることです。どうすればこれを検証できますか?
とりあえず、保存する前にコントローラーで呼び出される UserProfile クラスに静的メソッドを作成しました。このような:
public static bool ValidateUniquenessBlogSpace(string blogspace, string currentUsername, MembershipUserCollection col)
{
bool bUnique = true;
foreach (MembershipUser user in col)
{
UserProfile userprofile = Create(user.UserName) as UserProfile;
if (userprofile.BlogSpace == blogspace && userprofile.UserName != currentUsername)
return false;
}
return bUnique;
}
主な問題は、すべてのメンバーを通過することです。そのため、ユーザー ベースが拡大しても、非常に高速になるかどうかはわかりません。もう1つの問題は、コントローラからこれを呼び出すことによって、問題がこのフィールドから来ているというビューに戻り、適切なメッセージを表示する方法がわからないことです... (編集を参照)。私はこのようなアプローチが欲しいのですが、これはデータベースでのみ機能します:
public class UniqueBlogSpace : ValidationAttribute
{
public override bool IsValid(object value)
{
DataContext db = new DataContext();
var userWithTheSameBlogSpace = db.Users.SingleOrDefault(
u => u.BlogSpace == (string)value);
return userWithTheSameBlogSpace == null;
}
}
[UniqueBlogSpace(ErrorMessage = "This name is already in use...")]
public string BlogSpace { get; set; }
編集
これで、フィールドがコントローラーでこのような問題を抱えていることをモデルに伝える方法がわかりました。主な問題は、ユーザーベースが大きくなると、すべてのメンバーを解析する方法が非常に遅くなることです。一意性を検証するより良い方法はありますか?
ModelState.AddModelError("Blogspace", new System.Exception());