2014-02-05 75 views
1

我目前正在在用戶輸入他們的電子郵件地址的註冊頁面。 我希望每封電子郵件都是唯一的。MVC遠程驗證(唯一的電子郵件地址)

這是我RegisterModel的一部分:

[Required()] 
    [System.Web.Mvc.Remote("IsUserEmailAvailable", "Account")] 
    [EmailAddress()] 
    [DataType(DataType.EmailAddress)] 
    [Display(Name = "Email")] 
    public string Email { get; set; } 

..

這是我的AccountController的一部分:

public JsonResult IsUserEmailAvailable(string UserEmail) 
    { 
     return Json(!db.UserProfiles.Any(User => User.UserName == UserEmail),  JsonRequestBehavior.AllowGet); 
    } 

這是我的我的看法:

<script src="~/Scripts/jquery-1.7.1.min.js" type="text/javascript"></script> 
<script src="~/Scripts/jquery.validate.min.js" type="text/javascript"></script> 
<script src="~/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script> 


<hgroup class="title"> 
    <h1>Create Account</h1> 
</hgroup> 

@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary() 

    <fieldset> 
     <legend>Registration Form</legend> 
     <ol> 
      <li> 
       @Html.LabelFor(m => m.UserName) 
       @Html.TextBoxFor(m => m.UserName) 
      </li> 
      <li> 
       @Html.LabelFor(m => m.Password) 
       @Html.PasswordFor(m => m.Password) 
      </li> 
      <li> 
       @Html.LabelFor(m => m.ConfirmPassword) 
       @Html.PasswordFor(m => m.ConfirmPassword) 
      </li> 
      <li> 
       @Html.LabelFor(m => m.Email) 
       @Html.TextBoxFor(m => m.Email) 
      </li> 
      <li> 
       @Html.LabelFor(m => m.ConfirmEmail) 
       @Html.TextBoxFor(m => m.ConfirmEmail) 
      </li> 
     </ol> 
     <input type="submit" value="Registrera" /> 
    </fieldset> 
} 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

如果我刪除[System.Web.Mvc.Remote(「IsUserEmailAvailable」,「Account」)]一切都很好,除了電子郵件地址不會是唯一的。有了它,當我按提交時,沒有任何反應。

我錯過了什麼?

+1

你能展示你的觀點嗎?如可能你錯過了展示驗證錯誤Html.ValidationMessageFor –

+0

編輯我的帖子:) – Reft

+1

嘗試增加html.ValidationMesageFor電子郵件 –

回答

0

@Daniel J.G.是正確的。向該函數添加[AllowAnonymous]使其可訪問。

+0

是謝謝先生,現在的工作。愚蠢的我。 我有一個全球性的過濾器, filters.Add(新System.Web.Mvc.AuthorizeAttribute()); – Reft

0

[Remote]屬性是相當有限的,並且需要的屬性的名字是相同的爲控制器動作的參數的名稱。

  • 你的屬性名爲Emailpublic string Email { get; set; }

  • 你的操作有一個名爲UserEmail參數作爲IsUserEmailAvailable(string UserEmail)

這是行不通的,因爲遠程驗證將結束將請求發送到驗證字段等:

Account/IsUserEmailAvailable?Email=foo 

哪裏Email是屬性的名稱。實際上,它是呈現的html輸入字段的名稱屬性。這可能是嵌套模型的一個問題,其名稱將類似於NestedModel.Email,但幸運的是它不是您的情況。 (參見例如this question

所以,您的驗證方法接收USEREMAIL爲空(因爲請求中包含名爲電子郵件一個參數),這可能會導致請求失敗。

public JsonResult IsUserEmailAvailable(string Email) 
{ 
    ... 
} 

:(?你檢查你的瀏覽器的控制檯,看看Ajax請求失敗)

由於這兩個名字應該匹配,你可以這樣參數被命名爲電子郵件更新您的控制器動作希望能幫助到你!

+0

我已經編輯我的行動! \t公共JsonResult IsUserEmailAvailable(字符串email) { 返回JSON(DB .UserProfiles.Any(User => User.Email == Email),JsonRequestBehavior.AllowGet); } \t同樣在這裏,沒有任何反應。 \t另外,它並沒有說任何關於ajax請求,一切都是空白的。 – Reft

+0

這是從網絡選項卡鉻: \t位置:/Account/Login?ReturnUrl=%2fAccount%2fIsEmailAvailable%3fEmail%3dmyslex%2540gmail.com&Email=myslex%40gmail.com \t [十八時36分12秒] \t請求URL:http://本地主機:60576 /帳號/ IsEmailAvailable電子郵件= myslex%40gmail.com \t請求方法:GET \t狀態代碼:302找到 – Reft

+0

另外,在我AccountModel我不能包括使用系統命名空間.Web.Mvc; \t我的[比較]屬性我的其他線路去紅色和它說:「想不出命名空間中找到blablabla」,所以我把它作爲你現在看到了,在遠程屬性之前一行。 \t感謝您的幫助 – Reft

0

你可以設置一個MVC控制器動作並使用jquery進行即時查詢。這裏是一篇文章,解釋如何做到這一點(建議它是一個自動完成的文本框,但理論是相同的):How Do I Create an Auto-Complete TextBox?

我會非常感興趣的是看到你想出的解決方案來實現這個任務。