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