2014-01-21 47 views
2

我有一個aspx文件,其中將包含很多部分,我希望每個部分都在它自己的包含文件中。我可以將所有代碼放在主文件中。我正在使用:<! - #include file =「section1.aspx」 - >在正文中。當我構建時(我仍然只包含代碼的第一部分),我得到「名稱'lbl_phone'在當前上下文中不存在」,因爲後面的代碼有一個例程引用此屏幕字段,其中包含文件。什麼是更好的方式去做這件事?如何避免使用aspx包含文件造成錯誤?

編輯(因爲它是現在,希望我砍了正確這裏,現在構建好,但在瀏覽器錯誤):

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

文件: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"; 
    } 
} 

文件: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 = ...的行)

+0

最後我把後面的代碼爲僅僅是使用在.ascx文件的頂部以下各部分相關的每個部分:< %@ Control Language =「C#」CodeFile =「section1.ascx.cs」Inherits =「_ section1」%> –

回答

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"; 
} 
+0

您的示例與我正在做的不匹配。你的示例有c#代碼。我想將aspx(html)代碼包含到.aspx文件中。所有的C#代碼將在後面的單個代碼中。 ?? –

+0

@HankKnah我的例子有一個腳本和嵌入式控件(TextBox和兩個按鈕)。您也可以在其中放置常規的HTML元素。 – mason

+0

@HankKnah我對它進行了修改,使其更接近您所描述的內容。 – mason

0

控制定義爲頁或主的一部分頁面或用戶控件默認爲私有。爲了解決這個問題,添加一個暴露它的公共屬性。將此屬性記入帳戶.ascx.cs

public Label lbl_phone_public_version{ 
    get { 
     return lbl_phone; 
    } 
} 

當您嘗試從ola上的代碼引用lbl_phone時。aspxcs,你必須通過父控件做到這一點,就像這樣:

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

好的,非常感謝!你是否也有過如何去其他方向的樣本?假設電話號碼位於主要.aspx中來自sql的數據集中,我想在ascx.cs文件中使用它。如果它在aspx.cs中,它將是lbl_phone.Text = compDetails.Rows [0] [「PhoneNumb」]。ToString();但如何設置它在ascx.cs中設置? –

+0

@HankKnah您可以傳入頁面上的控件的ID,然後讓用戶控件找到該控件。它變得雜亂,但。最好設計用戶控件,使它們具有便攜性。 – mason