8

问这么简单的问题我觉得有点傻,但我似乎找不到答案。我是 ASP.NET (C#) 的新手,但我通过构建一组显示报告的简单网页来学习。我有一个代表公司名称的变量。我需要在网页的多个位置输出这个变量。我发现输出变量的唯一方法是:

company_name.Text = "Acme Windows";

然后

<asp:literal id="company_name" runat="server" />

我的问题是我想在页面的多个位置使用 company_name。每次将其放置在页面上时,我真的必须创建一个单独的变量来保存相同的值吗?如果我只是将上面的 XML 代码复制到我想显示变量的所有地方,它显然会创建一个编译错误,因为该 ID 已经定义。

我觉得我错过了一些非常明显的东西。

4

5 回答 5

11

最简单的方法是在您的代码隐藏类中创建一个字符串变量或属性,并使用<%= %>符号(缩写为Response.Write)在您的页面内联呈现它:

// You can do this anywhere on your .aspx, as many times as you like.
<%= this.CompanyName %>

// Better yet, html encode the value to protect against various threats,
// such as cross-site script injection (XSS)
<%= HttpUtility.HtmlEncode(this.CompanyName) %>

.NET 4.0 引入了一种新的快捷方式符号 ( Html Encoding Blocks ) 来对您的输出进行 html 编码:

<%: this.CompanyName %>

关于您的原始方法,ASP.NET Web 控件Literal代表网页的各个部分 - 您不能在页面上多次使用它们,因为对象实例company_name指的是<asp:literal>.aspx 页面中生成的 HTML 的特定部分.

于 2010-04-19T17:20:38.703 回答
3

在这种情况下,您在页面上创建一个属性并在您需要的每个地方输出它。

public string CompanyName { get { return "Acme Windows"; } }

在 aspx 中:

.NET 4.0:

<%:this.CompanyName%>

4.0之前:

<%=this.companyName%>
于 2010-04-19T17:22:39.953 回答
1

您可以动态添加控件:

Literal myLiteral = new Literal();
myLiteral.text = "Acme Windows";
this.Page.Controls.Add(myLiteral);

您还可以在页面上的特定控件中添加控件,方法是将 this.Page.Controls 引用更改为要添加文字的特定控件。

于 2010-04-19T17:22:41.967 回答
1

为什么这是一个社区维基?

无论如何,您有多种可能性来实现您想要的。放置多个具有相同名称的变量肯定不是最佳实践。如果你把它填满,让我们称之为“半动态”值,我不会把它硬编码在你的代码中。我要做的是使用全局资源文件。

您在 App_GlobalResources 文件夹中创建一个新资源文件,并添加一个值为“Acme Windows”的键“COMPANY_NAME”。然后在您的 ASPX 代码中,您可以执行类似的操作

<asp:literal id="company_name" runat="server" Text="<%$ Resources:GlobalResources, Button_Save %>"/>

前段时间写了一篇博文,详细介绍了这种方法。资源文件的优点是您不必接触代码。

如果你想进一步“重构”——假设你有一些一般的公司信息,你必须在页面的不同位置显示——你可以创建一个单独的 UserControl,其中包含公司名称、电话号码、联系信息等信息。那个控制你有你的文字,标签,无论你用什么来准确地显示该信息 1 次。然后将此 UserControl 放置在实际页面上您需要它的位置上,甚至多次放置。

于 2010-04-19T17:31:32.413 回答
0

最简单的答案是您需要定义多个控件。

但更好的解决方案是这样做:

在事物背后的代码上创建一个属性:

protected CompanyName{get;set;}

然后,在 aspx 方面,使用<%= %>命令引用它

<span><%=CompanyName %></span>
于 2010-04-19T17:21:59.020 回答