如何在文本框旁边显示自定义异常?

时间:2012-09-22 18:13:34

标签: asp.net-mvc-3 linq entity-framework

我有登记表。我想检查数据库中是否存在新的用户名,如果有数据库,则在其文本框“UserName已存在...”旁边显示异常,我该怎么办? 这是我的方法,除了我在Register action中使用它。:

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

            }
        }

1 个答案:

答案 0 :(得分: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 异步来为用户提供丰富的用户体验。为此,您需要做的是查找文本框的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>

现在我们应该有一个名为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);      

}

注意:永远不要只接受客户端方法。无论您是否进行客户端检查,始终执行服务器端检查