2012-02-29 14 views
1

私のプロジェクトでリモート検証に奇妙な問題があるようです。私はそれが一意であることを確認するために、電子メールフィールドで簡単な検証チェックを行っています。MVC 3遠隔検証jQueryエラーon submit

テキストボックスにカーソルを置き、それを削除してフォームを送信する前に少なくとも1回は検証をトリガーしないと、JavaScriptエラーが発生します。

e[h] is not a function jquery.min.js line 3 

上記のエラーが返された後にフォームを再送信しようとすると、すべて正常に動作します。検証が返ってくるのを待つ前に提出しようとしたフォームとほぼ同じです。

私のフォームを送信する前に、送信時にリモート検証リクエストを黙って発砲する必要がありますか?

以下は私が使用しているコードのスナップショットです(POSTの代わりにGETを試みましたが、同じ結果が得られます)。上で述べたように、コードは正常に動作しますが、バリデーションが少なくとも1回はトリガされない限り、フォームはjqueryエラーを返します。

モデル:

public class RegisterModel 
    { 
     [Required] 
     [Remote("DoesUserNameExist", "Account", HttpMethod = "POST", ErrorMessage = "User name taken.")] 
     [Display(Name = "User name")] 
     public string UserName { get; set; } 

     [Required] 
     [Display(Name = "Firstname")] 
     public string Firstname { get; set; } 

     [Display(Name = "Surname")] 
     public string Surname { get; set; } 

     [Required] 
     [Remote("DoesEmailExist", "Account", HttpMethod = "POST", ErrorMessage = "Email taken.", AdditionalFields = "UserName")] 
     [Display(Name = "Email address")] 
     public string Email { get; set; } 

     [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 8)] 
     [DataType(DataType.Password)] 
     [Display(Name = "Password")] 
     public string Password { get; set; } 

     [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 8)] 
     [DataType(DataType.Password)] 
     [Display(Name = "Confirm password")] 
     public string ConfirmPassword { get; set; } 

     [Display(Name = "Approved?")] 
     public bool IsApproved { get; set; } 
    } 

public class UserRoleModel 
    { 
     [Display(Name = "Assign Roles")] 
     public IEnumerable<RoleViewModel> AllRoles { get; set; } 
     public RegisterModel RegisterUser { get; set; } 
    } 

コントローラー:

// POST: /Account/DoesEmailExist 
    // passing in username so that I can ignore the same email address for the same user on edit page 

    [HttpPost] 
    public JsonResult DoesEmailExist([Bind(Prefix = "RegisterUser.Email")]string Email, [Bind(Prefix = "RegisterUser.UserName")]string UserName) 
    { 
     var user = Membership.GetUserNameByEmail(Email); 
     if (!String.IsNullOrEmpty(UserName)) 
     { 
      if (user == UserName) 
       return Json(true); 
     } 
     return Json(user == null); 
    } 

ビュー:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script> 
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.17/jquery-ui.min.js" type="text/javascript"></script> 

<script type="text/javascript" src="/Content/web/js/jquery.unobtrusive-ajax.min.js"></script> 
<script type="text/javascript" src="/Content/web/js/jquery.validate.min.js"></script> 
<script type="text/javascript" src="/Content/web/js/jquery.validate.unobtrusive.min.js"></script> 
...... 


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

       <div class="titleh"> 
        <h3>Edit a user account</h3> 
       </div> 
       <div class="body"> 

        @Html.HiddenFor(model => model.RegisterUser.UserName) 
        @Html.Partial("_CreateOrEdit", Model) 

        <div class="st-form-line"> 
         <span class="st-labeltext">@Html.LabelFor(model => model.RegisterUser.IsApproved)</span> 
         @Html.RadioButtonFor(model => model.RegisterUser.IsApproved, true, new { @class = "uniform" }) Active 
         @Html.RadioButtonFor(model => model.RegisterUser.IsApproved, false, new { @class = "uniform" }) Disabled 
        <div class="clear"></div> 
        </div> 

        <div class="button-box"> 
         <input type="submit" name="submit" value="Save" class="st-button"/> 
         @Html.ActionLink("Back to List", "Index", null, new { @class = "st-clear" }) 
        </div>      
       </div> 
      } 

CreateEdit部分図

@model Project.Domain.Entities.UserRoleModel 

<div class="st-form-line"> 
    <span class="st-labeltext">@Html.LabelFor(m => m.RegisterUser.Firstname)</span> 
    @Html.TextBoxFor(m => m.RegisterUser.Firstname, new { @class = "st-forminput", @style = "width:300px" }) 
    @Html.ValidationMessageFor(m => m.RegisterUser.Firstname) 
<div class="clear"></div> 
</div> 

<div class="st-form-line"> 
    <span class="st-labeltext">@Html.LabelFor(m => m.RegisterUser.Surname)</span> 
    @Html.TextBoxFor(m => m.RegisterUser.Surname, new { @class = "st-forminput", @style = "width:300px" }) 
    @Html.ValidationMessageFor(m => m.RegisterUser.Surname) 
<div class="clear"></div> 
</div> 


<div class="st-form-line"> 
    <span class="st-labeltext">@Html.LabelFor(m => m.RegisterUser.Email)</span> 
    @Html.TextBoxFor(m => m.RegisterUser.Email, new { @class = "st-forminput", @style = "width:300px" }) 
    @Html.ValidationMessageFor(m => m.RegisterUser.Email) 
<div class="clear"></div> 
</div> 
犬は上記のコメントに言及して

おかげで、

リッチ

+0

を、私は、問題はあなたのフォームで「送信」という名前の入力を持っているということである賭けます。入力に「submit」と入力した場合、form.submitを使用してフォームを送信することはできません。次のStackoverflow質問/回答をよく調べてください。http://stackoverflow.com/questions/3553584/cannot-submit-form-with-submit/3553600#3553600 –

答えて

0

ここでの問題は、正確です。フォームの名前とIDを設定すると、このバグが修正されました。

は、したがって、上記のコードに基づいて、私はこれでビューのBeginFormセクションを置き換え:

@using (Html.BeginForm("Edit", "Account", FormMethod.Post, new { id = "editForm", name = "editForm" }))