<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>");
}
}
}
我是来学习的 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.
<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>");
}
}
}