PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASP.Net Webcontrol vor body-Element


Kabelsalat
2006-04-26, 21:06:14
Hallo,

Ich habe momentan ein kleines Verständnisproblem was .Net 1.1 und folgende ASPX-Datei angeht:

<%@ Page Language="C#" AutoEventWireup="false" CodeBehind="ErrorPage.aspx.cs" Inherits="epiSource.DNN.Modules.epiFrame.ErrorPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title><asp:Literal runat="server" ID="ltTitle" /></title>
<link rel="stylesheet" type="text/css" href="<% = TemplateSourceDirectory + "/css/ErrorPage.css" %>" />
</head>
<body>
<div class="root">
<div class="caption"><asp:Literal runat="server" ID="ltCaption" /></div>
<div class="content">
<p><asp:Literal runat="server" ID="ltContent" /></p>
</div>
</div>
</body>
</html>

Das Literal-Control ltTitle ist im CodeBehind korrekt bekannt gemacht, wird allerdings nicht sauber initialisiert (ltTitle == null): Das muss ich erst händisch durch mit "ltTitle = (System.Web.Ui.WebControls.Literal) FindControl("ltTitle");" übernehmen.

Ich verstehe jedoch nicht, wie es dazu kommen kann. Eigentlich sollte die Position im Markup vollkommen egal sein, insbesondere da der serverseitiger Code Elemente ohne runat="server" schlichtweg ignorieren sollte. Außerdem funktioniert auch die Verwendung von Webcontrols in z.B. Seiten mit dem ContentType "text/css", die auch keinen HTML-Markup enthalten.

Unter .Net 2 habe ich das ganze wesentlich geschickter gelöst, aber für .Net 1 habe ich keine ordentlichere Lösung gefunden (ehrlichgesagt habe ich auch nicht weiter danach gesucht, da die eigentliche Anwendung für .Net 2 entwickelt wurde und das hier bloß ein Backport ist, bei dem es nicht umbedingt auf die Code-Qualität ankommt). Interessanterweise funktioniert jedoch auch die Lösung mit den Literals unter .Net 2 - selbst das Webcontrol im title-Element bereitet keine Probleme, wenngleich der Code-Editor der Meinung ist, dass der Tagpräfix asp unbekannt wäre.

Grüße vom Bodensee

Kabelsalat

Kabelsalat
2006-04-26, 21:12:17
Wäre es evtl. sinnvoller direkt auf das jeweilige Element zuzugreifen? Also z.B. das title-Element mit runat="server" und einer ID zu versehen? ... Zugriff dann eben über InnerText.

Gast
2006-04-26, 23:34:43
Geht bei mir problemlos:

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="WebApplication2.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title><asp:Literal id="MyLiteral" runat="server" /></title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
</form>
</body>
</HTML>




using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace WebApplication2
{
/// <summary>
/// Summary description for WebForm1.
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Literal MyLiteral;

private void Page_Load(object sender, System.EventArgs e)
{
this.MyLiteral.Text = "Hallo";
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion
}
}

Kabelsalat
2006-04-26, 23:39:57
Vergesst alles, was ich geschrieben habe ;) Wie dumm kann man nur sein: Das Control heißt in der ASPX-Datei ltTitle, im Codebehind arbeite ich jedoch mit der Variablen ltTitel :fresse: