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);
    }
}

回答の 1 つで、FirstOrDefault()ユーザー名の可用性を確認するために使用されます。

  • このFirstOrDefaultメソッドは、ソースが空の場合に返す既定値を指定する方法を提供しないことに注意してください[MSDN]
  • 場合によっては、データベースに 2 つの同じユーザー名がある場合、それらの間の最初のユーザー名が返されます。登録は、セキュリティに関連するデリケートな問題です。したがって、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 を使用してください。ユーザー名が見つからないため、null 例外が返されます。例外で try catch を使用し、false を返します。PSは、私のような素人が理解できるように、適切な変数名を使用します。

編集: はい、例外的な場合にのみ try catch 例外処理を使用する必要があります。私の要点は、最初にどの例外が発生しているのかわからない場合は、これを使用して例外の種類を見つけ、それに応じて処理する必要があるということでした。

于 2013-06-19T16:49:43.903 に答える