在buttonclick上检查文件是否存在然后提示消息并还原

时间:2015-10-28 12:35:28

标签: javascript jquery asp.net

我有一个场景,我想检查用户是否再次添加same datesame region数据,它应该给他一个提示警告。

我尝试使用代码,如下所示: -

 protected void btnSave_Click(object sender, EventArgs e)
{

    DataTable dtExcel = new DataTable();
    dtExcel.Clear();
    string StrCount = String.Empty;
    string connString = "";
    HttpPostedFile File = FileUpload1.PostedFile;
    string strFileType = Path.GetExtension(FileUpload1.FileName).ToLower();
    string path = FileUpload1.PostedFile.FileName;
    string Filename = path.Substring(path.LastIndexOf("\\") + 1, path.Length - path.LastIndexOf("\\") - 1);
    path = Server.MapPath(@"~/Excels/" + "/" + Filename.ToString());

    File.SaveAs(path);
    if (strFileType.Trim() == ".xls")
    {
        connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
    }
    else if (strFileType.Trim() == ".xlsx")
    {
        connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
    }
    string query = "SELECT * FROM [Sheet 1$]";
    OleDbConnection conn = new OleDbConnection(connString);
    conn.Close();
    if (conn.State == ConnectionState.Closed)
        conn.Open();
    OleDbCommand cmd = new OleDbCommand(query, conn);
    OleDbDataAdapter daExcel = new OleDbDataAdapter(cmd);

    daExcel.Fill(dtExcel);
    conn.Close();


    DataTable DtMain = CF.ExecuteDT("select Tran_type, Order_Date, Region_Mkey from WMS_Future_Del_Order_Hdr where Tran_type = '" + CmbTypeOfAsn.SelectedValue + "' and Order_Date = convert(datetime,'" + TxtEdate.Value + "',103) and Region_Mkey = '" + ddlRegion.SelectedValue + "'"); // checks the duplicate records here


    if (DtMain.Rows.Count > 0)
    {
        ClientScript.RegisterStartupScript(this.GetType(), "SuccessScript", "myTestFunction()", true);  
    }

另请参阅我的提示重复消息提醒的功能

function myTestFunction() {
         if (confirm('Are you sure you want to override the file ?')) {
             return true;
         }
         else {
             return false;
         }
     }

但是这里发生的事情即使在取消点击后,也会上传并保存excel文件。我不知道为什么

4 个答案:

答案 0 :(得分:2)

虽然基于AJAX的 Abbas Kapasi 解决方案很好(并且您不希望/不能使用基于CheckBox的解决方案,正如我在其他帖子中所建议的那样{{3如果您不熟悉AJAX或者不想使用AJAX,那么您可以使用以下方法实现它。这可能看起来有点奇怪,但您可以根据您的要求进行修改:

  1. 我将代码拆分为上传并在一个程序中查找现有文件/记录,以及在另一个子程序中写入/覆盖记录的代码。
  2. 然后我使用了两个LinkBut​​tons,LinkButtonLoadLinkButtonOverwrite LinkButtonLoad将附加到上传和查找现有文件/记录的主程序的调用。 LinkButtonOverwrite将调用该过程来写入/覆盖记录。 LinkBut​​tonOverwrite将保持隐藏来自用户
  3. 在第一个过程中,如果系统找到现有文件/记录,它将显示客户端提示给用户是否覆盖。如果文件/记录不存在,它将调用第二个子程序来写入记录。
  4. 在客户端,如果显示现有文件/记录的提示,并且用户选择Cancel/No,则该过程将不会继续。如果用户选择OK/Yes,那么我将调用链接到LinkBut​​ton2的过程来覆盖记录。
  5. 现在把它们放在一起:

    在aspx /前端

    <asp:LinkButton ID="LinkButtonLoad" runat="server" Text="Load Records" CssClass="button" ... />
    <asp:LinkButton ID="LinkButtonOverwrite" runat="server" Text="ow" CssClass="button hidden" ... />
    

    我使用hidden CSS类来隐藏按钮.hidden {display: none;}。不要使用visible="false"属性,它在客户端不可用。

    客户端的JavaScript:

    function myTestFunction() {
        if (confirm('Are you sure you want to override the file ?')) {
            // get the action attribute of the hidden LinkButtonOverwrite here and call it on OK
            // as an alternative you may also invoke the click event of this button
            var defaultAction = $('#<%=LinkButtonOverwrite.ClientID %>').prop("href");
            window.location.href = defaultAction;
        }
        else {
            return false;
        }
    }
    

    后面的代码中的LinkBut​​tonLoad:

    protected void LinkButtonLoad_Click(object sender, EventArgs e)
    {
        //==============================================================
        // YOUR CODE TO UPLOAD THE FILE, SAVE IT SO WE MAY USE IT AGAIN
        //==============================================================
        if (DtMain.Rows.Count > 0)
        {
            ClientScript.RegisterStartupScript(this.GetType(), "SuccessScript", "myTestFunction()", true);
        }
        else
        {
            MySubToOverwrite();
        }
    }
    

    后面的代码中的LinkBut​​tonOverwrite:

    protected void LinkButtonOverwrite_Click(object sender, EventArgs e)
    {
        //===========================================================
        // AS THE FILE IS ALREADY UPLOADED IN LINKBUTTONUPLOAD_CLICK
        // YOU MAY ACCESS IT AND PERFORM REQUIRED OPERATIONS
        //===========================================================
    
        MySubToOverwrite();
    }
    

    后面的MySubToOverwrite()代码:

    private void MySubToOverwrite()
    {
        //==========================================================
        // OVERWRITE YOUR RECORDS HERE
        // FROM THE FILE ALREADY UPLOADED IN LINKBUTTONUPLOAD_CLICK
        //==========================================================
    }
    

答案 1 :(得分:1)

检测重复记录

有几种方法可以做到这一点。按照我的个人喜好,点击这里的大图:

  1. 最简单的方法:不要检查。提示首先。预先提供一个复选框。 enter image description here
  2. 使用2个Ajax请求:一个用于检查现有记录,另一个用于保存文件(如果用户说&#34; OK&#34;或者文件尚不存在)。挑战:多用户环境。
  3. 多步回POST。服务器代码注入一个动态控件(或显示隐藏的静态控件),提示用户覆盖。丑,但不需要JS。您可能会记得90年代的情况。
  4. 版本控制:更高级,更复杂,但对于企业系统,这是可行的方法。不要覆盖具有相同标识符的文件;存储它的不同版本。然后你会得到一个很好的历史和审计跟踪谁更改了它。这样可以轻松地修复错误,责怪人等等。
  5. 取消PostBack (如果使用选项3或其他回发方法)

    你需要绑定到正确的按钮,并防止POST到服务器(AKA&#34;回发&#34;),你必须return false

    • 呈现的click

      input type="button"事件处理程序

    • submit
    • form事件处理程序

    您可以通过在myTestFunction()本身中将返回值嵌入asp:Button来实现此目的:

    <asp:Button ID="btnSave" runat="server" Text="Save"
      OnClientClick="if(!myTestFunction()){return false;}" 
      OnClick="btnSave_Click" />
    
    <script>
      function myTestFunction() {
          return confirm('Override the file?');
      }
    </script>
    

答案 2 :(得分:0)

使用web服务的ajax函数来检查相同的数据和区域

提交按钮代码

 <asp:Button ID="btnupload" runat="server" OnClientClick="javascript return checkData()"
                                        Text="Upload" OnClick="btnupload_Click"></asp:Button>

Javacript

<script>

function checkData() {

            $.ajax({
                type: "POST",
                url: "demo.aspx/functionName1",
                data: "{parameter1:'" + param1 "',parameter2:'" + param2 + "'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (msg) {
                   if(msg.d == 'Yes'){
                       if (confirm('Are you sure you want to override the file ?')) {
                                return true;
                           }
                          else {
                                return false;
                         }
                    }
                    else{
                         return true;
                   }
                }
            });
        }


</script> 

C#代码

using System.Web.Services; --- use this class

   [WebMethod]
        public static string functionName1(string parameter1, string parameter2)
        {

            ------------------------------;

           if(check Condition)
            return "Yes";
           else
            return "No"
        }

答案 3 :(得分:0)

实际上,您只需要以下内容即可使其正常运行。使用RegisterOnSubmitStatement代替RegisterStartupScript。它允许您添加为响应按钮的onclick事件而执行的脚本。该脚本在调用按钮事件之前执行,并为您提供取消事件的机会。

<强> Code-behind:

protected void Page_Load(object sender, EventArgs e)
{
  // You can place this in any method where you want to do the validation. 
   String scriptText =
       "return confirm('Are you sure you want to override the file ?')";
        ClientScript.RegisterOnSubmitStatement(this.GetType(),
            "ConfirmSubmit", scriptText);
}

protected void btnSave_Click(object sender, EventArgs e)
{

}

<强> Markup :

<asp:Button id="ConfirmSubmit" runat="server" OnClick="btnSave_Click"/>