<script runat="server"> 对比 <% %>

<script runat="server"> vs <% %>

我是来学习的 ASP.NET 这就是为什么我显然是来这里问问题的。因此,当我 运行 在 <% %> 分隔符内的语句时,一切正常。我尝试在 <script runat="server"> 中改为 运行 但它不起作用。我只是好奇这两种方法之间有什么显着差异。我假设使用的是脚本方法,但它只适用于 <% %>

我的示例是这样的...从 POST 方法获取 "userInput"(一个数字)的基本标准形式。

        <form action="calcprime.aspx" method="post">
            Enter a number between 1-999: 
            <input type="text" name="userInput" maxlength="3" />
            <input type="submit" name="submit" value="Submit" />
        </form>

然后,如果我需要将字符串转换为整数以对其进行数学计算,我会这样做...

<%@ Page Language="C#" %>

<script runat="server">
    int num = int.Parse(Request.Form["userInput"]);
</script>

<%=num%>    // <-should display the number in theory..(in my head)

不幸的是,上面的代码错误并且对我不起作用,但是仅使用 <% %> 的替代方法使用完全相同的代码方法可以 100% 正常工作。比如下面...

<%@ Page Language="C#" %>

<%
    int num = int.Parse(Request.Form["userInput"]);
    Response.Write(num);    //displays the number as it should.. 100% working
%>

所以我的问题是。为什么脚本方式不起作用?这不是一回事吗?使用 C# 在 ASP.NET 中处理这种基本情况的正确方法是什么?我的方法是否实用,或者是否有我应该了解的标准?该数字将对其进行数学运算,这就是我需要将其转换为整数的原因。这只是一些基本的基础知识,我觉得在学习不良做法之前我应该​​知道正确的方法。

<script runat="server">
    int num = 1;
</script>

<%=num%>

在我的机器上运行良好。我在我的页面上看到 1

但是,这不起作用:

<script runat="server">
    int num = int.Parse(Request.Form["userInput"]);
</script>

<%=num%>  

我收到这个错误:

CS0120: An object reference is required for the non-static field, method, or property 'System.Web.UI.Page.Request.get'

我怀疑您也遇到了这个错误,但没有将其包含在您的问题中。 注意 如果您在代码中遇到错误,请将其包含在您的问题中。不要假设我们知道你有错误。

这可行,假设我向请求适当地添加了查询字符串 URL:

<script runat="server">
    int num = int.Parse(HttpContext.Current.Request.QueryString["randomnum"].ToString());
</script>

<%=num%>  

假设您已经将表单值发布到页面,我怀疑这也能奏效。但是,您的问题不完整,所以我不知道您是否这样做了。这只是表明,您需要提交 Minimal, Verifiable, and Complete example.

<script runat="server">
    int num = int.Parse(HttpContext.Current.Request.Form["userInput"]);
</script>

<%=num%>

然而最后,您可能不应该在页面上内联代码块(无论是使用脚本标记还是内联表达式)。这最好在代码后面处理。 <% %> 东西在某些情况下很好,但您通常应该只使用它来将值注入页面,例如当您在中继器中评估某些东西时。如果您发现自己在做很多内联表达式,您可能会考虑切换到 ASP.NET MVC 或网页。两者都使用 Razor view engine,它更干净。

你的 .aspx 文件被幕后 ASP.NET 编译器转换成 .cs 文件(即纯 C#)(与 [=51 中的 C# 编译器分开) =]).如果您在计算机上找到“Temporary ASP.NET Files”文件夹,您可以看到这些临时 .cs 文件。

这些 .cs 文件中的 class 有一个名为 Render 的大函数,它输出到响应流(使用 Response.Write)。 .aspx 文件中的所有静态 HTML 都转换为 String 实例并直接输入 Response.Write.

<% %> 块被转换为内联 C# 代码,在 Render 函数内分解这些大量的 String 实例。

<script runat="server"> 块被粘贴为此运行时生成的 class.

中的 class 成员

<asp:Foo runat="server"> 元素被转换为 Control 实例化和渲染调用。

所以这个:

<%@ Page Inherits="ParentPageClass" %>
<html>
<head>
    <script runat="server">
    String DoSomething() {
        return "lulz";
    }
    </script>
</head>
<body>
    <% int x = 5; %>
    <%= x %>
    <div>
        <asp:Button runat="server" />
    </div>
</body>
</html>

转换成这样:

(我通过删除额外的跟踪调用简化了这个示例。#line 文本是特殊的预处理器指令,因此 YSOD 系统可以将运行时错误映射回您的 .aspx 文件)。

namespace ASP {

    [System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()]
    public class webform1_aspx : ParentPageClass, System.Web.SessionState.IRequiresSessionState, System.Web.IHttpHandler {

        String DoSomething() {
            return "lulz";
        }

        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        private global::System.Web.UI.WebControls.HyperLink @__BuildControl__control2() {
            global::System.Web.UI.WebControls.HyperLink @__ctrl;


            @__ctrl = new global::System.Web.UI.WebControls.HyperLink();

            @__ctrl.ApplyStyleSheetSkin(this);

            @__ctrl.Text = "WebControls are evil";
        }

        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        private void @__BuildControlTree(webform1_aspx @__ctrl) {

            this.InitializeCulture();

            global::System.Web.UI.WebControls.HyperLink @__ctrl1;

            @__ctrl1 = this.@__BuildControl__control2();

            System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));

            @__parser.AddParsedSubObject(@__ctrl1);

            @__ctrl.SetRenderMethodDelegate(new System.Web.UI.RenderMethod(this.@__Render__control1));
        }

        private void @__Render__control1(System.Web.UI.HtmlTextWriter @__w, System.Web.UI.Control parameterContainer) {

            @__w.Write("\r\n    </head>\r\n    <body>\r\n        ");


            #line 11 "c:\users\dai\documents\visual studio 2013\Projects\WebApplication1\WebApplication1\WebForm1.aspx"
            int x = 5; 

            #line default
            #line hidden

            #line 12 "c:\users\dai\documents\visual studio 2013\Projects\WebApplication1\WebApplication1\WebForm1.aspx"
            @__w.Write( x );


            #line default
            #line hidden

            @__w.Write("\r\n        <div>\r\n            ");

            parameterContainer.Controls[0].RenderControl(@__w);

            @__w.Write("\r\n        </div>\r\n    </body>\r\n    </html>");
        }
    }
}