我在我的 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;
}
主要问题是它会通过所有成员,所以如果我的用户群增长我不确定它会非常快。另一个问题是,通过从控制器调用它,我不确定如何返回问题来自该字段的视图并显示适当的消息......(见编辑)。我想要这样的方法,但这仅适用于数据库:
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());