我正在制作一个注册表格。它有一个名为UserName
的文本框。我想点击按钮检查用户名可用性。我正在使用asp.net MVC4。点击按钮我调用了以下功能。如果用户名已在数据库中,则返回成功,但如果用户名不在数据库中,则不返回。它在执行查询时停止。这是我的功能代码。如果用户名不可用,我想返回false。
public JsonResult CheckUserName()
{
string userName = Request["UserName"];
var cx = new PostAdPage.Models.mydbEntities3();
// Stops at this line if username is not available
var u = cx.signups.First(x => x.username.Equals(userName));
if (u.username.Equals(userName))
{
return this.Json(true, JsonRequestBehavior.AllowGet);
}
else
{
return this.Json(false, JsonRequestBehavior.AllowGet);
}
答案 0 :(得分:6)
对First的调用在没有找到结果时抛出异常,所以我想这就是为什么它会在你的情况下停止执行。
您应该调用FirstOrDefault,如果没有匹配的用户名,则返回null。
var u = cx.signups.FirstOrDefault(x => x.username.Equals(userName));
if (u != null) //Found
return this.Json(true, JsonRequestBehavior.AllowGet);
else //Not found
return this.Json(false, JsonRequestBehavior.AllowGet);
答案 1 :(得分:4)
您需要使用SingleOrDefault()
代替First()
。
使用First()
-
使用SingleOrDefault()
-
null
。您可以进一步检查空值,如果为null,则返回适当的响应。 所以,你的方法将如下所示:
public JsonResult CheckUserName()
{
string userName = Request["UserName"];
var cx = new PostAdPage.Models.mydbEntities3();
// Check unique unsername
var u = cx.signups.SingleOrDefault(x => x.username.Equals(userName));
if (u != null)
{
return this.Json(true, JsonRequestBehavior.AllowGet);
}
else
{
return this.Json(false, JsonRequestBehavior.AllowGet);
}
}
在其中一个答案中,FirstOrDefault()
用于检查用户名是否可用。
FirstOrDefault
方法不提供指定要返回的默认值的方法。 SingleOrDefault()
在语义上更适合在此上下文中使用。答案 2 :(得分:2)
同样的事情,但更简单:
public JsonResult CheckUserName()
{
string userName = Request["UserName"];
var cx = new PostAdPage.Models.mydbEntities3();
// Check unique unsername
var isUunique = cx.signups.Any(x => x.username.Equals(userName));
return Json(isUunique, JsonRequestBehavior.AllowGet);
}
答案 3 :(得分:-4)
当您遇到任何异常时,请始终使用try catch。由于未找到用户名,因此返回null异常。使用try catch并在异常中返回false。 P.S使用适当的变量名称,以便像我这样的外行可以理解。
编辑:是的,我们应该仅针对特殊情况使用try catch异常处理。我的观点是,首先如果您不知道发生了哪个异常,您应该使用它来找出异常的类型,然后相应地处理。