用户名可用性

时间:2013-06-19 16:26:41

标签: c# entity-framework asp.net-mvc-4

我正在制作一个注册表格。它有一个名为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 个答案:

答案 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()用于检查用户名是否可用。

  • 请注意如果source为空[MSDN],则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异常处理。我的观点是,首先如果您不知道发生了哪个异常,您应该使用它来找出异常的类型,然后相应地处理。