<script runat = "server"> против <%%>

Я здесь изучаю ASP.NET, поэтому я, очевидно, здесь задаю вопрос. Поэтому, когда я запускаю заявление внутри <% %> разделители все работает отлично. Я пытаюсь вместо этого запустить его в <script runat="server"> и это не работает. Мне просто любопытно, что же значительного отличается между этими двумя методами. Я полагаю, что использовать метод сценария, но он работает только с <% %>,

Мой пример - это... базовая стандартная форма, получающая userInput (число) из метода 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
%>

Итак, мой вопрос. Почему сценарий не работает? Разве это не одно и то же? Как правильно обрабатывать этот базовый сценарий в ASP.NET с помощью C#? Является ли мой подход практичным или есть какой-то стандарт, о котором мне следует знать? Число будет иметь математическое значение, поэтому мне нужно преобразовать его в целое число. Это всего лишь несколько базовых основополагающих вещей, которые, я думаю, я должен знать, как правильно поступить, прежде чем изучать плохие практики.

2 ответа

Решение
<script runat="server">
    int num = 1;
</script>

<%=num%>

Это прекрасно работает на моей машине. Я вижу 1 на моей странице.

Тем не менее, это не работает:

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

<%=num%>  

Я получаю эту ошибку:

CS0120: ссылка на объект требуется для нестатического поля, метода или свойства 'System.Web.UI.Page.Request.get'

Я подозреваю, что вы тоже получили эту ошибку, но не включили ее в свой вопрос. ПРИМЕЧАНИЕ, если вы получили ошибку в своем коде, включите ее в свой вопрос. Не думайте, что мы знаем, что вы получили ошибку.

Это работает, если я добавлю строку запроса соответствующим образом в URL запроса:

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

<%=num%>  

Я подозреваю, что это тоже будет работать, если вы уже разместили значения формы на странице. Однако ваш ответ был неполным, поэтому я не знаю, сделали ли вы это или нет. Это просто говорит о том, что вам нужно представить пример Minimal, Verifiable и Complete.

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

<%=num%>

Однако, в конце концов, вы, вероятно, не должны делать встроенные блоки кода (будь то использование тега сценария или встроенного выражения) на своей странице. Это лучше обрабатывается на код позади. <% %> В некоторых контекстах все хорошо, но обычно вы должны использовать его только для того, чтобы ввести значение на страницу, например, когда вы просматриваете что-то в повторителе. И если вы обнаружите, что делаете много таких встроенных выражений, вы можете подумать о переходе на ASP.NET MVC или веб-страницы. Оба они используют Razor View Engine, который намного чище.

Ваш .aspx файлы конвертируются в .cs файлы (то есть чистый C#) закулисным компилятором ASP.NET (отдельно от компилятора C# в IDE). Вы можете увидеть эти временные .cs файлы, если вы найдете свой "Temporary ASP.NET Filesпапка на вашем компьютере.

Класс в этих .cs файлы имеют большую функцию под названием Render что выводит в поток ответов (используя Response.Write). Весь статический HTML в вашем .aspx файл конвертируется в 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>");
        }
    }
}
Другие вопросы по тегам