Javascript函数不会立即运行

时间:2011-02-13 13:48:36

标签: c# javascript asp.net file-upload

我有一些函数javascript用FileUpload Control检查加载的文件

 <script language="javascript" type="text/javascript">
        function CheckFileBeforeUpdate() 
        {
            var filePath = document.getElementById('<%= this.upFile.ClientID %>').value;
            var validExtension = 'xml';
            var ext = filePath.substring(filePath.lastIndexOf('.') + 1).toLowerCase();
            if (ext == validExtension) return true;
            alert('The file extension ' + ext.toUpperCase() + ' is not allowed!');
            return false;
        }
    </script>

并使用Button调用它:OnClientClick =“return CheckFileBeforeUpdate();

<asp:Button ID="LoginButton" runat="server" CommandName="Login" Text="Log In" 
           onclick="LoginButton_Click" OnClientClick="return CheckFileBeforeUpdate();" />

所以有不寻常的情况: 我选择了合适的文件,点击登录...然后继续进行下一个功能,尽管扩展不足。

否则,如果我,例如单击FileUpload,但不选择任何文件。 下次我选择一些文件(即使扩展名不好),然后运行功能(显示警告)。

为什么会像封锁一样?我怎么做才能每次都更改CheckFileBeforeUpdate()?

修改 如果我选择没有文件,则显示警报(“选择要登录的文件”);当然。然后是锁定释放

<script language="javascript" type="text/javascript">
    function CheckFileBeforeUpdate() 
    {
        var filePath = document.getElementById('<%= this.upFile.ClientID %>').value;
        var popupWindow = document.getElementById('<%= this.popupWin.ClientID %>').value;
        if (filePath.length < 1) {
            alert("Select file to log in");
            return false;
        }
        var validExtension = 'xml';
        var ext = filePath.substring(filePath.lastIndexOf('.') + 1).toLowerCase();
        if (ext == validExtension) return true;
        alert('The file extension ' + ext.toUpperCase() + ' is not allowed!');
        return false;
    }
</script>

3 个答案:

答案 0 :(得分:1)

你可以用asp验证器做到这一点:

<asp:FileUpload ID="fu1" runat="server" />
<asp:RequiredFieldValidator ID="req" runat="server"
   ErrorMessage="Select file" ControlToValidate="fu1" />
<asp:RegularExpressionValidator ID="rgx" runat="server"
   ErrorMessage="Extension not allowed" ControlToValidate="fu1"
   ValidationExpression=".*\.[xX][mM][lL]" />

答案 1 :(得分:1)

完全基于问题和评论,显而易见的答案是删除这一行:

var popupWindow = document.getElementById('<%= this.popupWin.ClientID %>').value;

popupWindow的值不会在发布的代码中的任何位置使用,因此看起来不需要该行。

编辑:

根据评论,我查看了控件。见this link。我认为这里的问题是这个控件是在回发或页面加载之后显示的,而不是来自javascript。由于我没有控件,我无法确定,但如果在回发发生之前需要使用Javascript在客户端上显示此控件,请尝试查看呈现页面的来源,看看是否可以找到HTML代表弹出窗口。希望它在一个div中,将popupWin.ClientID值设置为id。如果是这种情况,那么您可以使用此javascript来获取对它的引用:

var popupWindow = document.getElementById('<%= this.popupWin.ClientID %>'); //omit the .value

然后,您可以使用自己喜欢的代码来显示popupWindow div。我不会在这里包含这些代码,因为如果你不使用像jQuery这样的东西,如果你想让它在所有的浏览器中运行,那么正确答案就会很长。

就个人而言,我只会使用alert()并跳过此控件。它更简单,更有可能适用于所有浏览器。

答案 2 :(得分:0)

<script type="text/javascript">
    var validFilesTypes = ["bmp", "gif", "png", "jpg", "jpeg", "doc", "docx", "xls", "xlsx", "rar", "zip", "txt", "pdf"];

    function CheckExtension(file) {
        /*global document: false */
        var filePath = file.value;
        var ext = filePath.substring(filePath.lastIndexOf('.') + 1).toLowerCase();
        var isValidFile = false;

        for (var i = 0; i < validFilesTypes.length; i++) {
            if (ext == validFilesTypes[i]) {
                isValidFile = true;
                break;
            }
        }

        if (!isValidFile) {
            file.value = null;
            alert("Invalid File. Valid extensions are:\n\n" + validFilesTypes.join(", "));
        }

        return isValidFile;
    }
</script>