2012-09-22 48 views
0

我有註冊表格。我想檢查新的用戶名是否在數據庫中,如果有數據庫,它的文本框「用戶名已存在...」旁邊的異常顯示,我該怎麼辦? 這是我的方法與我在註冊動作中使用它的例外:我如何顯示文本框旁邊的自定義異常?

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

      } 
     } 

回答

3

您可以設置模型誤差,並返回模型對象查看。

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

而且你並不需要從數據庫的USR列表,做一個循環來檢查用戶輸入的用戶名是否存在與否。您可以使用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) 

但是,理想情況下,我還要做asynchronosly阿賈克斯提供了豐富的用戶體驗給用戶。爲此,您需要做的是查找文本框的模糊事件並獲取文本框的值,對操作方法進行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> 

現在我們應該有一個叫入住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);  

} 

注:決不做客戶端的方法只無論您是否有客戶端檢查,請務必執行服務器端檢查

+0

我想檢查用戶名,並設置錯誤顯示在視圖中,在上面的方法,並在我的行動中使用它... – Smo

+0

上述答案檢查用戶名是否存在,並顯示消息在視圖中。你還在找什麼? – Shyju

+0

@Shyju:很好的解釋。更準確地說,服務器端方法的返回類型也可以是JsonResult。 – Kamyar

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)並在代碼中拋出異常。此示例代碼已被簡化。

+0

謝謝所有... @kamyar我用你的建議,但它有錯誤,因爲異常之前顯示的信息。但它對我來說很有幫助,感謝kamyar:)@ Shyju我沒有使用json代碼,因爲我不太熟悉它;但是我使用了一段代碼,謝謝。 – Smo

+0

@ShohrehMortazavi很高興幫助你。祝你好運 – Kamyar

相關問題