0

登録フォームがあります。dbにあるかどうかにかかわらず、新しいユーザー名を確認したいのですが、DBにある場合は、テキストボックス「UserNamealreadyexists ...」の横に例外が表示されます。どうすればよいですか?これは、登録アクションで使用したことを除いて、私のメソッドです。

public void InsertNewUser(MemberRegisterModel mm)
    {
        EShopThemeDBEntities context = new EShopThemeDBEntities(idbconnection.ConnStr);
        using (context)
        {
            var listUsers = (from o in context.Users
                             select o.Username).ToList();
            var a = listUsers.Count();
            foreach (var item in listUsers)
            {
                if (mm.Username == item.ToString())
                {
                   throw new Exception("UserName already exist...");
                }

                User mmr = new User();
                mmr.FName = mm.FName;
                mmr.LName = mm.LName;
                mmr.Username = mm.Username;
                mmr.Password = mm.Password;
                mmr.Email = mm.Email;
                mmr.Phone = mm.Phone;
                mmr.Mobile = mm.Mobile;
                mmr.CreateDate = DateTime.Now;
                mmr.RoleId = 2;
                context.AddToUsers(mmr);
                context.SaveChanges();

            }
        }
4

2 に答える 2

3

モデルエラーを設定して、モデルオブジェクトを表示に戻すことができます。

if(mm.Username == item.ToString())
{
   ModelState.AddModelError("UserName","Username already taken";)
   return View(model);
}

また、データベースからユーザーのリストを取得し、ループを実行して、ユーザーが入力したユーザー名が存在するかどうかを確認する必要はありません。この方法を使用して、FirstOrDefault少なくとも1つはそこにあります。

using (context)
{
  var user=(from o in context.Users 
                               where o.UserName==mm.UserName).FirstOrDefault();
  if(user!=null)
  {
     ModelState.AddModelError("UserName","Username already taken";)
     return View(model);
  }
  else
  {
       //Save new user info
  }
}

ビューのテキストボックスの隣に検証フィールドがあることを確認してください

@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)

しかし、理想的には、ユーザーにリッチなユーザーエクスペリエンスを提供するために、ajaxと非同期で実行することもできます。そのためにあなたがしなければならないことは、テキストボックスのblurイベントを探してテキストボックスの値を取得し、ユーザー名の可用性をチェックして適切な結果を返すアクションメソッドへのajax呼び出しを行うことです。

<script type="text/javascript">
  $(function(){
    $("#UserName").blur(){
      var userName=$(this).val();
      $.getJSON("@Url.Action("Check","User")/"+userName,function(response){
         if(response.status=="Available")
         {
            //It is available to register. May be show a green signal in UI
         }
         else
         {
           //not available. Show the message to user
          $("#someMsgDIv").html("User name not available");
         }
      });    
    });
  });    
</script>

これで、ajaxリクエストを処理するためのCheckinUserControllerというアクションメソッドが必要になります。

public ActionResult Check(string id)
{
  bool isAvailable=false;
  string userName=id;
  //Check the user name is availabe here 
  if(isAvailable) 
       return Json(new { status="Available"},
                                     JsonRequestBehaviour.AllowGet);
    else
       return Json(new { status="Not Available"},
                                     JsonRequestBehaviour.AllowGet);      

}

注:クライアント側のアプローチのみを実行しないでください。クライアント側のチェックがあるかどうかに関係なく、常にサーバー側のチェックを実行してください。

于 2012-09-22T18:18:29.620 に答える
0

Shyjuの答えは徹底的な答えです。ただし、例外の処理に関するコメントに基づいて、次のサンプルを示します。

public void InsertNewUser(MemberRegisterModel mm)
{
    // Some code...
    if (userExists)
    {
        throw new ArgumentException("User name not available");
    }
}

アクションメソッドで:

public ActionResult AddUser(MemberRegisterModel newUser)
{
    try
    {
      var userManager = new MembersSrv();
      userManager.InsertNewUser(newUser);
    }
    catch (ArgumentException ex)
    {
        if (ex.Message == "User name not available")
        {
            ModelState.AddModelError("UserName","Username already taken";)
            return View(model);
        }
    }
}

Exceptionより良い方法は、クラス(eg )から派生するクラスを定義DuplicateUserNameExceptionし、コードでその例外をスロー/キャッチすることであることに注意してください。このサンプルコードは簡略化されています。

于 2012-09-22T20:09:38.180 に答える