【问题标题】:Where is this ASP.NET feature documented? <%= string format, params object[] args %>此 ASP.NET 功能记录在哪里? <%= 字符串格式,参数对象[] args %>
【发布时间】:2013-09-10 11:52:05
【问题描述】:

显然可以在 ASP.NET Web 表单页面和视图中使用&lt;%= %&gt; 构造(渲染块)编写格式化输出。

<%= "{0} is {1}", "Foo", 42 %>

这将呈现“Foo is 42”。据我所知,ASP.NET 解析器将&lt;%= %&gt; 转换为对HttpResponse.Write(string) 的调用。显然在上面的代码中,没有一对一的翻译,因为参数的数量不匹配(假设上面表达式中的,分隔了参数)。

现在我看到TextWriter 类有一个Write(string, object[]) 方法。

我检查了解析器的输出,确实它调用了TextWriter 的方法,该方法接受params object[] 参数进行格式化:

private void @__Renderform1(System.Web.UI.HtmlTextWriter @__w, System.Web.UI.Control parameterContainer) {
    // ...
    @__w.Write( "{0} is {1}", "Foo", 42 );

这种行为是否记录在任何地方?

【问题讨论】:

  • +1 教我一些新东西。
  • @Heinzi 第一次看到它,我认为它一定是一个错误,也是因为 ReSharper 用警告突出显示它“方法'__ReSharper_Render'有 1 个参数,但用 3 个参数调用( s)“预期表达式”。
  • 这只是经典的 M$FT。我已经在他们的堆栈上构建应用程序 13 年了,这样的东西似乎总是会出现。我不得不说,在开源社区中,你几乎从来没有见过这样的东西,它没有在任何地方记录。可能很难导航,因为您永远不知道要使用哪个库,但它们已记录在案。

标签: asp.net parsing compiler-construction response.write server-tags


【解决方案1】:

这很接近并且可能相关 http://msdn.microsoft.com/en-us/library/586y06yf.aspx 但它不能解释为什么

【讨论】:

    【解决方案2】:

    据我所知,ASP.NET 解析器将 转换为对 HttpResponse.Write(字符串)。

    也许&lt;%= "{0} is {1}", "Foo", 42 %&gt; 被翻译成Response.Output.Write(string format, params object[] arg)OutputTextWriter 类型,这就是解释 根据http://www.hanselman.com/blog/ASPNETResponseWriteAndResponseOutputWriteKnowTheDifference.aspx

    【讨论】:

    • 我用解析器的输出编辑了我的问题。它直接调用HtmlTextWriter.Write(string format, params object[] args)
    • @michielvoo 我也看过了。 转换相同,而 转换为 base.Response.Write("Foo") 我猜@__w 是 Response.Output。我将不得不找到一种方法来检查;-)
    • 我所做的是使用渲染块创建一个简单的 ASPX 页面,在 web.config 中将 debug 设置为 true,在 ASPX 页面的某处导致编译错误,然后请求该页面。在错误页面上有一个显示编译源的选项,它显示了解析器生成的代码。
    • @michielvoo 在查看了用于 aspx 页面编译的单声道源代码之后,我无法确定相同的行为是否适用于单声道。这很有趣。 github.com/mono/mono/blob/master/mcs/class/System.Web/…
    【解决方案3】:

    这是一个 &lt;%= %&gt; embedded code block 并且存在以保持与经典 ASP 的兼容性。

    如您所见,&lt;%= "{0} is {1}", "Foo", 42 %&gt; 相当于:

    string s = string.Format("{0} is {1}", "Foo", 42);
    Response.Write(s);
    

    该行为已记录在案here

    写入包含对象数组的文本表示的格式化字符串 到输出流,以及任何挂起的制表符间距。 此方法使用与 String.Format 方法相同的语义。 (覆盖 TextWriter.Write(String, Object[])。)

    Here 是记录代码渲染块调用 Write 方法的地方。

    最后,已针对 .NET 4 更新了嵌入式代码块的语法,如 here 所述。

    【讨论】:

    • +1 用于所有文档链接 - 但没有一个明确说明您可以在嵌入式代码块中使用 implied 语法。
    • 你在说什么隐含的语法? String.Format 接受可变数量的参数。
    • &lt;%= %&gt; 实际上并不是一个“嵌入式代码块”,而是一个“带有内联表达式的代码渲染块”。并且文档可能会声明它调用Reponse.Write(string),但该方法不支持格式化。该文档没有将&lt;%= %&gt; 连接到HtmlTextWriter,因此这些块内的格式化支持可能并不广为人知。很奇怪,不是吗?
    • 它被记录为具有类似于 String.Format 的语义。我错过了每个人的问题。当我在 Visual Studio 中键入代码并单击 F1 寻求帮助时,它会将我带到嵌入式代码块的帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    相关资源
    最近更新 更多