我在这里学习ASP.NET,这就是我明显在这里提出问题的原因。因此,当我在<% %>
分隔符内部运行语句时,一切正常。我尝试在<script runat="server">
中运行它并且它不起作用。我只是好奇这两种方法之间的重大差异。我想使用脚本方法,但它只适用于<% %>
。
我的例子是......基本的标准形式得到&#34; userInput&#34; (一个数字)来自POST方法。
<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中处理这个基本场景的正确方法是什么?我的方法是否实用,还是有一个我应该注意的标准?数字将完成数学,这就是我需要将它转换为整数的原因。这只是一个基本的基础内容,我觉得在学习不良实践之前我应该知道正确的方法。
答案 0 :(得分:3)
<script runat="server">
int num = 1;
</script>
<%=num%>
在我的机器上工作正常。我在页面上看到1
。
但是,这不起作用:
<script runat="server">
int num = int.Parse(Request.Form["userInput"]);
</script>
<%=num%>
我收到此错误:
CS0120:非静态字段需要对象引用, 方法或属性&#39; System.Web.UI.Page.Request.get&#39;
我怀疑你也遇到了这个错误,但是没有把它包含在你的问题中。 注意如果您的代码出错,请将其包含在您的问题中。不要以为我们知道你有错误。
这是有效的,假设我将查询字符串适当地添加到请求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或Web页面。这两个都使用Razor view engine,这更清晰。
答案 1 :(得分:3)
您的.aspx
文件由幕后ASP.NET编译器(与IDE中的C#编译器分开)转换为.cs
个文件(即纯C#)。如果找到&#34; .cs
&#34;您可以看到这些临时Temporary ASP.NET Files
文件。您计算机上的文件夹。
这些.cs
文件中的类有一个名为Render
的大函数,它是响应流的输出(使用Response.Write
)。您.aspx
文件中的所有静态HTML都会转换为String
个实例并直接反馈到Response.Write
。
<% %>
块转换为内联C#代码,可以解析String
函数中的这些大量Render
实例。
<script runat="server">
块被粘贴为类成员。
<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>");
}
}
}