上传文件脚本将无法加载,因为它无法找到函数bt1Clicked()

时间:2012-03-05 02:40:21

标签: c# asp.net file-upload

我试图让客户端在ASP.NET C#网站上将文件上传到我的服务器。我创建了一个简单的脚本来介绍上传文件和创建脚本的细微差别,其中所有代码(HTML和C#代码)都在同一个文件中。

我的问题:函数uploadFile()从不输出/返回任何字符串结果,因为它应返回一个字符串,描述上传是否成功或失败的原因。

我做错了什么?

PS:我已使用以下代码更新了我的web.config:

<appSettings>
 <add key="folderPath" value="uploadedFiles"></add>
</appSettings>

PPS:拥有我的C#代码&amp;是否有任何问题HTML都在同一个.aspx文件中?把它们分开是不是更好?

我的简单代码:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test.aspx.cs" Inherits="WebApplication1.test" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script type="text/C#">
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Web;
        using System.Web.UI;
        using System.Web.UI.WebControls;
        using System.Configuration;

        protected global::System.Web.UI.HtmlControls.HtmlInputFile fileUpload;
        protected global::System.Web.UI.WebControls.Label lblMessage;
        protected global::System.Web.UI.WebControls.Button btnSave;
        protected global::System.Web.UI.HtmlControls.HtmlGenericControl test;

        protected void bt1Clicked(Object sender, EventArgs e)
        {
            if (fileUpload.PostedFile != null)
            {
                string strFilename, strMessage;
                strFilename = fileUpload.PostedFile.FileName.ToString();
                strMessage = uploadFile(strFilename, ConfigurationManager.AppSettings["folderPath"]);
                output.InnerHtml = strMessage;
            }
        }

        public string uploadFile(string fileName, string folderName)
        {
            if (fileName == "")
            {
               return "Invalid filename supplied";
            }
            if (fileUpload.PostedFile.ContentLength == 0)
            {
                return "Invalid file content";
            }
            fileName = System.IO.Path.GetFileName(fileName);
            if (folderName == "")
            {
                return "Path not found";
            }
            try
            {
                if (fileUpload.PostedFile.ContentLength <= 2048000)
                {
                    fileUpload.PostedFile.SaveAs(Server.MapPath(folderName) + "\\" + fileName);
                    return "File uploaded successfully";
                }
                else
                {
                    return "Unable to upload,file exceeds maximum limit";
                }
            }
            catch (UnauthorizedAccessException ex)
            {
                return ex.Message + "Permission to upload file denied";
            }
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input id="fileUpload" type="file" Runat="server" NAME="fileUpload"/>
        <asp:button id="btnSave" runat="server" Text="Upload File" OnClick="bt1Clicked"></asp:button>
        <p id="output" runat="server">Result should be displayed here after clicking</p>
    </div>
    </form>
</body>
</html>

2 个答案:

答案 0 :(得分:1)

如果您要将C#代码放在首页,则需要将其放在<script runat="server">标记中。当我这样做时(很少),我通常会在HTML之后放置<script>标记。例如:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
...
</html>
<script runat="server">
//Code here
</script>

使用<script runat="server">的优点是,如果您正在编写Web应用程序(代码编译成dll),您可以创建运行服务器端的页面,而无需执行新的应用程序构建(当然您必须从CodeBehind指令中删除@Page属性。因此,如果您出现无论出于何种原因无法进行新构建的情况,那么在.aspx中为一个页面编写所有内容都非常有用。

话虽这么说,你可能最好在代码隐藏文件中编写代码(在你的情况下这是test.aspx.cs,你可以通过右键单击{{1}在VS.NET中找到它。在解决方案资源管理器中选择“查看代码”或在查看test.aspx文件时按F7键。使用代码隐藏文件将代码与HTML分开,更重要的是,编译应用程序时将引发编译错误。如果使用test.aspx,则在访问页面之前不会引发编译错误。

答案 1 :(得分:1)

回答您的PPS - 是的,一般来说,最好将C#代码放在一个单独的文件中。这有几个原因,我会在这里列出一些:

  1. 易于维护 - 在另一个文件中使用C#可以更轻松地修复或更改内容
  2. UI用户更容易使用 - 如果您正在与一个正在使用HTML和CSS等的设计类型的人一起工作,那么他们将更容易使用大多数html ASPX标记,而没有所有C#阻碍
  3. 预编译 - 如果C#代码位于单独的文件中,则可以将其预编译到DLL中,但如果它位于ASPX文件中,则需要在运行时由IIS编译。
  4. 我可能还有很多其他原因没有提到......
  5. 有些人可能会说,对于一个简单的测试/教程应用程序,您不必担心这么多,但是在进行教程等时最好实践最佳实践,因此以后对您来说似乎并不陌生。

    如果由于某种原因你必须将它全部放在一个文件中,请按照上面的rsbarro建议把它放在HTML下面一个完全独立的块中,这样就很好又干净。