如何避免使用aspx包含文件的构建错误?

时间:2014-01-21 23:36:13

标签: asp.net include

我有一个包含很多部分的aspx文件,我希望每个部分都有自己的包含文件。我可以将所有代码放在主文件中。我正在使用:<! - #include file =“section1.aspx” - >在身体里。当我构建时(我仍然只包含带代码的第一部分),我得到“名称'lbl_phone'在当前上下文中不存在”,因为后面的代码有一个例程,它引用了包含在IS中的这个屏幕字段文件。有什么更好的方法来解决这个问题?

编辑(就像现在一样,希望我在这里正确地删除它,现在构建良好但在浏览器中出错):

文件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>

file:ola.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text.RegularExpressions;
using System.Data.SqlClient;
    public partial class _ola : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
    {
        lbl_phone.Text = "000-000-1234";
    }
}

file: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>

在浏览器的运行时,我得到:对象引用未设置为对象的实例。 (对于lbl_phone.Text = ...的行)

2 个答案:

答案 0 :(得分:1)

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

相反,将可重用的东西嵌入到.ASCX用户控件中。 MSDN How To article

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>

然后,这可以嵌入到任意数量的ASPX页面中。

<%@ Register TagPrefix="uc" TagName="MyControlName" Src="~\Controls\MyControl.ascx" %>
<uc:MyControlName ID="MyControl1" runat="server" />

编辑 - 您应该在应用程序中使这些ASCX文件尽可能便携,以便它们是自包含的单元。您的ASPX代码不应该太多需要引用ASCX文件中包含的控件。如有必要,您可以为用户控件(MyControl.ascx.cs或MyControl.ascx.vb)执行代码隐藏,或者您可以使用脚本块将代码直接嵌入ASCX页面。

.NET Framework不会遵循服务器端包含,因此如果您尝试引用通过SSI包含的控件,它将无法正确编译。但您可能会引用ASCX文件中的控件。例如......

MyAdvancedControl.ascx

<% @ Control Language="C#" ClassName="Spinner" %>  
<asp:Label runat="server" id="lbl_phone" />
<script runat="server">
public Label Lbl_phone {get {return lbl_phone;}}
</script>

MyPage.aspx

<%@ Register TagPrefix="uc" TagName="MyAdvancedControlName" Src="~\Controls\MyAdvancedControl.ascx" %>
<uc:MyAdvancedControlName ID="MyControl2" runat="server" />

MyPage.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    MyControl2.Lbl_phone.Text="Galaxy S4";
}

答案 1 :(得分:0)

默认情况下,定义为页面或母版页或用户控件的一部分的控件是私有的。要解决这个问题,请添加一个公开它的公共属性。将此属性放在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";
}