2017-07-29 12 views
0

Webサービスasmxにデータを送信するために、このajaxコードを記述しました。それは動作しますが、1回のクリックで、データを複数回挿入し、2,3回クリックするとデータを挿入することがあります。ボタンのクリックが何度も実行されるのはなぜですか?

の.js

<script type="text/javascript"> 

      function save() 
      { 
       $("button").click 
       (
        function() 
        { 
         $.post 
         (
          "http://localhost:82/ws/himher.asmx/InsertUsers", 
          {name: txtUserName.value, pwd: txtUserPwd.value}, 
//       
         ); 

        } 
       ); 
      } 



     </script> 
    </head> 
<body> 
    <div class="container-fluid"> 
     <div class="row"> 
      <div class="col-md-12"> 
       <label>User Name</label> 
       <input id="txtUserName" type="text" class="form-control" /> 
      </div> 
     </div> 
     <div class="row"> 
      <div class="col-md-12"> 
       <label>Password</label> 
       <input id="txtUserPwd" type="text" class="form-control" /> 
      </div> 
     </div>  
     <br/> 
     <div class="row"> 
      <div class="col-md-12">  
       <button type="submit" onclick='save()' class="btn btn-primary pull-right">Register</button> 
      </div> 
     </div>  
    </div> 

は.cs:

public class himher : System.Web.Services.WebService 
{ 

    [WebMethod(EnableSession = true)] 
    //[ScriptMethod(UseHttpGet = false)] 
    public string InsertUsers(string name, string pwd) 
    { 
     try 
     { 
      basicoperation bop = new basicoperation(); 
      return bop.insertUsers(name, pwd); 
     } 
     catch (Exception ex) 
     { 

      throw ex; 
     } 


    } 


    public string insertUsers(string Name, string Password) 
    { 
      string status; 

      String ConStr = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString; 

      SqlConnection sqlCon = new SqlConnection(ConStr); // to make a connection with DB 

      SqlCommand sqlCom = new SqlCommand("InsertUsers", sqlCon); // now in order to perform action such as insert SP, we must create command object which needs command name and conncetion only 

      sqlCom.CommandType = CommandType.StoredProcedure; // you must tell the system that insertInfo is a storedprocedure 

      SqlParameter sqlParamName = new SqlParameter("@UserName", Name); 
      SqlParameter sqlParamPwd= new SqlParameter("@Password", Password); 

      sqlCom.Parameters.Add(sqlParamName); 
      sqlCom.Parameters.Add(sqlParamPwd);  

      try 
      { 
       sqlCon.Open(); 

       int i= sqlCom.ExecuteNonQuery(); // executenonquery is used for INSERT, UPDATE, DELETE 

       //sqlCom.ExecuteScalar(); // used to pick or read a single value from procedure 
       // Response.Write("Done"); 

       sqlCon.Close(); 

       status= "Success"; 
      } 
      catch (Exception ex) 
      { 
       //response.Write(ex.Message); 
       status = ex.Message; 
      } 
     return status; 
    } 
} 
+0

'{name:txtUserName.value、 pwd:txtUserPwd.value} '。 –

答えて

2

あなたはあなたのボタンをクリックしたときにそれらのいずれかがバインドされセーブ機能には2つのバインディングを、持っています。このようなあなたのJSを書き直し:

<script type="text/javascript"> 
    function save() 
    { 
     $.post(
      "http://localhost:82/ws/himher.asmx/InsertUsers", 
      {name: txtUserName.value, pwd: txtUserPwd.value} 
     ); 
    } 
</script> 

あなたsave機能はのみ省ロジックを行います。この道を。 この関数を呼び出すためののバインドは、<button type="submit" onclick='save()'>によってHTMLで行われます。

0

このコードをユーザーに公開する場合は、実際に一度クリックするだけではなく、重複するアクション防止を実装する必要があります。あなたが何倍にしたのかを知ることができますが、データベースからゴミを守るためにユーザの行動に頼ることはできません。彼らはゆっくりとヒットし、そのボタンを欲求不満で叩いてしまいます。ボタンを無効にしても、更新されて再度送信されます。あなたが挿入する前にあなたのデータを控除 - これは多層情報セキュリティです。ボタンを叩くのを止めるスクリプトを無効にしても、重複を受け入れることはありません

注:私はこれを一度クリックして3つのデータを挿入します。そのバグを修正しますが、サーバー内でのデータの純度に関するユーザーの行動を制御してください。(完全に制御されている場所)

関連する問題