时间:2015-02-17 23:48:57

标签: c# asp.net request.form

我在这里学习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中处理这个基本场景的正确方法是什么?我的方法是否实用,还是有一个我应该注意的标准?数字将完成数学,这就是我需要将它转换为整数的原因。这只是一个基本的基础内容,我觉得在学习不良实践之前我应该​​知道正确的方法。

2 个答案:

答案 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>");
        }
    }
}