Asp.net 如何使用aspx包含文件避免生成错误?

Asp.net 如何使用aspx包含文件避免生成错误?,asp.net,include,Asp.net,Include,我有一个aspx文件,它将包含许多节,我更希望每个节都包含在自己的include文件中。我可以把所有代码放到主文件中。我用的是:在体内。当我构建时(我仍然只包含带有代码的第一个部分),我得到“名称‘lbl_phone’在当前上下文中不存在”,因为后面的代码有一个例程引用include文件中的这个屏幕字段。有什么更好的方法可以做到这一点 编辑(现在是这样,希望我在这里适当地减少它,现在构建良好,但在浏览器中出错): 文件ola.aspx <%@ Page Language="C#" Auto

我有一个aspx文件,它将包含许多节,我更希望每个节都包含在自己的include文件中。我可以把所有代码放到主文件中。我用的是:在体内。当我构建时(我仍然只包含带有代码的第一个部分),我得到“名称‘lbl_phone’在当前上下文中不存在”,因为后面的代码有一个例程引用include文件中的这个屏幕字段。有什么更好的方法可以做到这一点

编辑(现在是这样,希望我在这里适当地减少它,现在构建良好,但在浏览器中出错):

文件ola.aspx

<%@ Page Language="C#" AutoEventWireup="true" Inherits="_ola" Codebehind="ola.aspx.cs" %>
<%@ Register TagPrefix="section" TagName="account" Src="account.ascx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><body><form id="ola_form1" runat="server">
<section:account id="section_account" runat="server" />
</form></body></html>
文件:account.ascx

<%@ Control Language="C#" ClassName="_ola" CodeBehind="account.ascx.cs" %>
Call us at <asp:Label ID="lbl_phone" runat="server" Text="lbl_phone"></asp:Label>

打电话给我们

在浏览器中运行时,我得到:Object reference未设置为对象的实例。(对于带有lbl_phone.Text=…)的线路)

不要使用服务器端包含。它们在ASP.NET体系结构中不能很好地工作

相反,将可重用的东西嵌入到.ASCX用户控件中

ASCX文件MyControl.ASCX

<% @ Control Language="C#" ClassName="Spinner" %>  
<table>
<tr><th>Column 1</th><th>Column 2</th></tr>
<tr><td>Some content</td><td>Some more content</td></tr>
</table>
<% @ Control Language="C#" ClassName="Spinner" %>  
<asp:Label runat="server" id="lbl_phone" />
<script runat="server">
public Label Lbl_phone {get {return lbl_phone;}}
</script>

默认情况下,定义为页面、母版页或用户控件一部分的控件是私有的。要解决这个问题,请添加公开它的公共属性。将此属性放入account.ascx.cs

public Label lbl_phone_public_version{ 
    get {
        return lbl_phone;
    } 
}
当您尝试从ola.aspxcs上的代码引用lbl_phone时,您必须通过父控件进行引用,如下所示:

    protected void Page_Load(object sender, EventArgs e)
{
    section_account.lbl_phone_public_version.Text = "000-000-1234";
}

你的样品与我正在做的不匹配。您的示例具有c#代码。我想在.aspx文件中包含aspx(html)代码。所有的c#编码都将在单个代码后面@我的例子有一个脚本和嵌入式控件(文本框和两个按钮)。您也可以将常规HTML元素放入其中。@Hanknah我对其进行了修改,使其更符合您所描述的内容。您是说每个包含文件都应该是.ascx吗?%@Register行是否位于我希望将代码包含在主aspx文件中或顶部的位置(然后如何将其显示到位)?tagprefix和标记名如何相互作用?当我阅读时,我无法理解用户控件。ASCX是一种将一组控件(以及与这些控件相关的逻辑)封装到可重用控件上的方法,可以放置在站点的任何页面上。Register指令位于页面指令下方的页面顶部(您也可以在web.config文件中注册控件,以避免在每个页面上单独注册)。标记前缀和标记名称用于提供用于引用控件的命名空间。请看ASCX用户控件和母版页的教程。好的,非常感谢!你能不能也给我一个去另一个方向的例子?假设电话号码位于main.aspx中sql的数据集中,我想在ascx.cs文件中使用该数据集。如果它在aspx.cs中,它将是lbl_phone.Text=compDetails.Rows[0][“PhoneNumb”].ToString();但是如何在ascx.cs中设置它呢?@hanknah您可以传入页面上控件的ID,然后让用户控件找到该控件。但是它变得很混乱。最好将用户控件设计为可移植的。最后,我在.ascx文件顶部使用以下内容为每个部分(仅与每个部分相关)添加了代码:
<%@ Register TagPrefix="uc" TagName="MyAdvancedControlName" Src="~\Controls\MyAdvancedControl.ascx" %>
<uc:MyAdvancedControlName ID="MyControl2" runat="server" />
protected void Page_Load(object sender, EventArgs e)
{
    MyControl2.Lbl_phone.Text="Galaxy S4";
}
public Label lbl_phone_public_version{ 
    get {
        return lbl_phone;
    } 
}
    protected void Page_Load(object sender, EventArgs e)
{
    section_account.lbl_phone_public_version.Text = "000-000-1234";
}