ASP.NET MVC 4、Internet 应用程序模板、SimpleMembership - 帐户模型 - 强制执行唯一的用户名和电子邮件
Posted
技术标签:
【中文标题】ASP.NET MVC 4、Internet 应用程序模板、SimpleMembership - 帐户模型 - 强制执行唯一的用户名和电子邮件【英文标题】:ASP.NET MVC 4, Internet Application Template, SimpleMembership - Account Model - enforce unique Username and Email 【发布时间】:2013-04-08 02:10:46 【问题描述】:如果您在 Visual Studio 2012 Express 中创建一个新的 ASP.net MVC 4 应用程序 - 并选择 Internet 应用程序模板 - 它会为您创建一个帐户模型来管理用户。
开箱即用,用户可以使用唯一的用户名和密码注册和登录。
您还可以将用户名更改为其他名称 - 例如电子邮件地址。
但是,要求用户输入唯一的用户名和电子邮件是很常见的。
如何更改开箱即用的功能来检查这一点?除了服务器端,客户端检查更可取。
我使用 Code First - 所以不想手动更改数据库和 SQL Server 2012 Express。
谢谢。
【问题讨论】:
令人沮丧的是,使用 Web 表单和 SQL Server 存储过程来实现它是微不足道的。显然 MVC 是进步 ;).... 【参考方案1】:如果您使用的是开箱即用的模板,您不必担心Username
,WebSecurity
会确保其独一无二。至于Email
,这是我在我目前正在开发的 Web 应用程序中所做的。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
if (ModelState.IsValid)
// Attempt to register the user
using (EfDb db = new EfDb())
UserProfile userEmail = db.UserProfiles.FirstOrDefault(u => u.Email.ToLower() == model.Email.ToLower());
try
// Check if email already exists
if (userEmail == null)
var token = WebSecurity.CreateUserAndAccount(
model.UserName,
model.Password,
new
model.Email
,
true);
ModelState.AddModelError("", ErrorCodeToString(MembershipCreateStatus.DuplicateEmail));
catch (MembershipCreateUserException e)
ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
// If we got this far, something failed, redisplay form
return View(model);
如您所见,这里的数据库与验证无关。 C# 代码负责处理它。只要确保在您的 ViewModel 中有这个:
[EmailAddress]
[Required]
[Display(Name = "Email")]
public string Email get; set;
在视图中
<div class="editor-label">
@html.LabelFor(model => model.UserName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserName)
@Html.ValidationMessageFor(model => model.UserName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Email)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)
</div>
【讨论】:
这真的很有帮助,谢谢 - 我对 MVC 还很陌生。下一个明显的问题 - 用户如何使用电子邮件和密码登录? ;)。或者更好的是用户名或电子邮件 - 和密码? 这看起来很有趣:***.com/questions/12404438/… @user2254951 如果您希望您的用户使用电子邮件地址登录,最简单的方法是使用带有[EmailAddress]
注释的Username
属性。这样,您就不需要 Email
属性。保持命名不变。另外,如果此答案解决了您的问题,请接受。
@user2254951 或者您可以在该链接中进行操作,但我还有其他一些想法可以尝试。如果您在另一个问题中提出这个问题会更好,所以我们可以尝试一些事情。
@Komengem:ModelState.AddModelError("", ErrorCodeToString(MembershipCreateStatus.DuplicateEmail));
不应该在else
块中吗?在您的情况下,它将始终运行 - 无论电子邮件是否重复。【参考方案2】:
我认为没有办法“自动”执行此操作。在您的帐户控制器中,在插入新用户名(创建新帐户)之前,您必须检查提交的新用户名是否已存在于数据库中,并在数据库中找到用户名时向视图发送适当的错误消息。
使用一些 javascript/jQuery,您可以实现“客户端”检查,这实际上会在后台(ajax 请求)向服务器提交新用户名,以检查并显示错误,或者继续提交其余的形式取决于结果。
【讨论】:
以上是关于ASP.NET MVC 4、Internet 应用程序模板、SimpleMembership - 帐户模型 - 强制执行唯一的用户名和电子邮件的主要内容,如果未能解决你的问题,请参考以下文章
asp.net MVC 4 0x80070005 - Javascript 运行时错误:访问被拒绝
Telerik asp.net mvc datepicker Internet Explorer (IE) 8 中的“无效参数”