如何检查用户是否已存在于 ASP.NET MVC 5 的客户端?
How to check if user already exists on client-side in ASP.NET MVC 5?
使用 Visual Studio 2013.4(Visual Studio 2013 更新 4)我创建了一个常规 ASP.NET MVC 5 项目与 个人用户帐户 身份验证配置。 Visual Studio 已经为我搭建了所有用户注册和登录功能并且工作正常。
如何在注册页面上实现以下规则的客户端验证:没有已注册的用户使用相同的电子邮件?
您可以使用 RemoteAttribute 通过服务器回调执行客户端验证。
1) 在AccountController
中添加如下方法:
[AllowAnonymous]
public async Task<JsonResult> UserAlreadyExistsAsync(string email)
{
var result =
await userManager.FindByNameAsync(email) ??
await userManager.FindByEmailAsync(email);
return Json(result == null, JsonRequestBehavior.AllowGet);
}
2) 添加 Remote
属性到 RegisterViewModel
的 Email
属性 class:
[Remote("UserAlreadyExistsAsync", "Account", ErrorMessage = "User with this Email already exists")]
public string Email { get; set; }
其中 "Account"
是服务控制器的名称,"UserAlreadyExistsAsync"
是它的操作名称。
这很有帮助。在我的例子中,它是 table,也可以进行更新。在这种情况下,上述解决方案不起作用。所以我想分享我对这个案例的解决方案。
在下面的解决方案中,我添加了一个附加字段以传递给控制器(模型的主键)。
然后在控制器中我检查是否给出了主键。
如果是这样,我们就知道我们来自更新站点,因为这是我们已经在模型中拥有 ID 的唯一情况。最后一步是检查字符串和主键是否相同。如果它们都是,那没关系,因为我们没有更改字符串中的任何内容。如果只有字符串相同而 ID 不相同,则意味着我们更改了字符串并将其更改为另一个现有的项目字符串,因此我们 return false.
型号:
[Key]
[Display(Name = "Idee ID")]
public int intIdeaID { get; set; }
[Required(ErrorMessage = "Dieses Feld muss ausgefüllt werden")]
[Display(Name = "Idee")]
[Remote("ideaExists", "TabIdea", HttpMethod = "POST", ErrorMessage = "Es wurde bereits eine Idee mit dieser Bezeichnung erstellt", AdditionalFields = "intIdeaID")]
public string strIdea { get; set; }
控制器:
[HttpPost]
public JsonResult ideaExists(string strIdea, int? intIdeaID)
{
if (intIdeaID != null)
{
if (db.tabIdea.Any(x => x.strIdea == strIdea))
{
tabIdea existingTabIdea = db.tabIdea.Single(x => x.strIdea == strIdea);
if (existingTabIdea.intIdeaID != intIdeaID)
{
return Json(false);
}
else
{
return Json(true);
}
}
else
{
return Json(true);
}
}
else
{
return Json(!db.tabIdea.Any(x => x.strIdea == strIdea));
}
}
使用 Visual Studio 2013.4(Visual Studio 2013 更新 4)我创建了一个常规 ASP.NET MVC 5 项目与 个人用户帐户 身份验证配置。 Visual Studio 已经为我搭建了所有用户注册和登录功能并且工作正常。
如何在注册页面上实现以下规则的客户端验证:没有已注册的用户使用相同的电子邮件?
您可以使用 RemoteAttribute 通过服务器回调执行客户端验证。
1) 在AccountController
中添加如下方法:
[AllowAnonymous]
public async Task<JsonResult> UserAlreadyExistsAsync(string email)
{
var result =
await userManager.FindByNameAsync(email) ??
await userManager.FindByEmailAsync(email);
return Json(result == null, JsonRequestBehavior.AllowGet);
}
2) 添加 Remote
属性到 RegisterViewModel
的 Email
属性 class:
[Remote("UserAlreadyExistsAsync", "Account", ErrorMessage = "User with this Email already exists")]
public string Email { get; set; }
其中 "Account"
是服务控制器的名称,"UserAlreadyExistsAsync"
是它的操作名称。
这很有帮助。在我的例子中,它是 table,也可以进行更新。在这种情况下,上述解决方案不起作用。所以我想分享我对这个案例的解决方案。
在下面的解决方案中,我添加了一个附加字段以传递给控制器(模型的主键)。 然后在控制器中我检查是否给出了主键。 如果是这样,我们就知道我们来自更新站点,因为这是我们已经在模型中拥有 ID 的唯一情况。最后一步是检查字符串和主键是否相同。如果它们都是,那没关系,因为我们没有更改字符串中的任何内容。如果只有字符串相同而 ID 不相同,则意味着我们更改了字符串并将其更改为另一个现有的项目字符串,因此我们 return false.
型号:
[Key]
[Display(Name = "Idee ID")]
public int intIdeaID { get; set; }
[Required(ErrorMessage = "Dieses Feld muss ausgefüllt werden")]
[Display(Name = "Idee")]
[Remote("ideaExists", "TabIdea", HttpMethod = "POST", ErrorMessage = "Es wurde bereits eine Idee mit dieser Bezeichnung erstellt", AdditionalFields = "intIdeaID")]
public string strIdea { get; set; }
控制器:
[HttpPost]
public JsonResult ideaExists(string strIdea, int? intIdeaID)
{
if (intIdeaID != null)
{
if (db.tabIdea.Any(x => x.strIdea == strIdea))
{
tabIdea existingTabIdea = db.tabIdea.Single(x => x.strIdea == strIdea);
if (existingTabIdea.intIdeaID != intIdeaID)
{
return Json(false);
}
else
{
return Json(true);
}
}
else
{
return Json(true);
}
}
else
{
return Json(!db.tabIdea.Any(x => x.strIdea == strIdea));
}
}