1

我正在制作注册表单。它有一个名为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);
    }
4

4 回答 4

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);
于 2013-06-19T16:40:44.047 回答
4

您需要使用SingleOrDefault()而不是First().

当你使用First()-

  • 它返回满足指定条件的序列的第一个元素。
  • 如果条件不匹配任何内容,因此它会抛出异常。

当你使用SingleOrDefault()-

  • 顾名思义,返回序列的单个特定元素,如果序列不包含任何元素,则返回默认值。
  • 在这种情况下是默认值null
  • 如果序列中有多个元素,此方法将引发异常。

您可以进一步检查 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()用于检查用户名的可用性。

  • 请注意,如果 source 为空[MSDN] ,该FirstOrDefault方法不提供指定要返回的默认值的方法。
  • 如果您在数据库中有两个相同的用户名,它将返回它们之间的第一个。注册是与安全相关的敏感问题。因此,SingleOrDefault()在语义上更适合在这种情况下使用。
于 2013-06-19T16:52:14.290 回答
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);
}
于 2013-06-19T19:19:02.040 回答
-4

当您遇到任何异常时,请始终使用 try catch。由于未找到用户名,因此返回空异常。使用 try catch 并在异常中返回 false。PS 使用正确的变量名称,以便像我这样的外行可以理解。

编辑:是的,我们应该只对异常情况使用 try catch 异常处理。我的观点是,起初如果你不知道发生了哪个异常,你应该使用它来找出异常的类型,然后进行相应的处理。

于 2013-06-19T16:49:43.903 回答