0

我有注册表。我想检查是否在 db 中的新用户名,如果在 DB 中,则在它的文本框“用户名已经存在...”旁边显示异常,我该怎么办?这是我的方法,但我在注册操作中使用了它。:

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方法至少有一个。

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异步执行此操作,以便为用户提供丰富的用户体验。为此,您要做的是查找文本框的模糊事件并获取文本框的值,对操作方法进行 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>

现在我们应该有一个名为 Check in UserController 的动作方法来处理 ajax 请求

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类(例如DuplicateUserNameException)的类,并在您的代码中抛出/捕获该异常。此示例代码已被简化。

于 2012-09-22T20:09:38.180 回答