2010-12-12 18 views
0

In MainPage.aspx IDatenbindung funktioniert nicht

<asp:HyperLink runat="server" NavigateUrl='<%#"http://google.pl"%>'>test</asp:HyperLink> 

haben Sie stellen keine href-Tag hinzufügen, sondern nur die Ausgänge <a>test</a>. Wenn ich das tue:

<asp:HyperLink runat="server" NavigateUrl='http://google.pl'>test</asp:HyperLink> 

Es funktioniert gut.

Warum <%#"http://google.pl"%> nicht funktioniert?

Wie es zu debuggen?

Antwort

6

Sie können HTML-Literale nicht in ASP-Steuereigenschaften ausgeben. Sie können entweder die Eigenschaft NavigateUrl des Hyperlinks in Codebehind festlegen oder den HTML-Anker als Literal ausgeben.

Ausgabe als wörtliche (in diesem Fall Ihre Code-Behind-Klasse muss eine aussetzen geschützt oder öffentliches Eigentum oder Feld mit dem Namen UrlParams)

// site.aspx 
<a href="<%="http://google.pl" + UrlParams.Google%>">test</a> 

Set in Code-Behind:

// site.aspx 
<asp:HyperLink runat="server" ID="link1">test</asp:HyperLink> 
// site.aspx.cs or <script runat="server">..</script> 
protected void Page_Load(..) { 
    link1.NavigateUrl = "http://google.pl" + UrlParams.Google; 
} 

Und die Antwort auf Ihre ursprüngliche Frage. Die <# ist eine data-binding expression, die eine Bindung zwischen einer Serversteuerungseigenschaft und einer Datenquelle erstellt.

EDIT: Wie sich herausstellt, können Sie tatsächlich die <# Syntax mit Zeichenfolgen auch verwenden. Der Schlüssel dafür ist, die Control.DataBind() Methode aufzurufen. Sie können es auf dem HyperLink-Steuerelement oder sogar auf der aktuellen Seite aufrufen, da Page von Control erbt.

Beispiel: (fügen Sie dies in einer leeren aspx Seite - keine Datenquellen erforderlich):

<asp:HyperLink ID="link1" runat="server" NavigateUrl='<%# "#Test" %>'>Test</asp:HyperLink> 
<script runat="server" type="text/C#"> 
    protected override void OnLoad(EventArgs e) 
    { 
     DataBind(); 
     // or: 
     // link1.DataBind(); 
     base.OnLoad(e); 
    } 
</script> 
0

Dies ist ein Stich im Dunkeln, aber die <%# und %> Tags zeigen an, dass Sie Datenverbindungscode ausführen möchten (wie in, etwas, das Sie von der Datenbank zurückgegeben haben).

Sie benötigen diese nicht, um ein Zeichenfolgenliteral auszugeben, aber wenn Sie dies täten, wäre das entsprechende Tag <%=, nicht <%#.

+0

Wenn ich '<% =' verwende gibt es folgenden Code in der Ausgabe: '">test' – hsz

+0

Ich habe noch nie versucht, dieses Tag in einer NavigateUrl-Eigenschaft zu verwenden (ich wollte damit nicht implizieren, dass Sie das verwenden sollten) Tag, und ich werde die Antwort in Kürze bearbeiten, um dies zu verdeutlichen), aber Sie müssen die ASP.NET-Tags nicht erneut verwenden, um Ihrer NavigateUrl-Eigenschaft ein Zeichenfolgenliteral zuzuweisen. – jwiscarson

+0

Ja, ich weiß, aber ich möchte diese Adresse zum Beispiel von einer Klasse erhalten: UrlParams.Google. Ich möchte dann tun: 'NavigateUrl = '<% =" http://google.pl "+ UrlParams.Google%>'' aber es funktioniert nicht. – hsz

3

Entschuldigen Sie mich, aber das funktioniert tatsächlich:

<asp:ListView ID="lvTest" runat="server"> 
<ItemTemplate> 
    <asp:HyperLink ID="test" NavigateUrl='<%#"http://google.pl"%>' runat="server">test</asp:HyperLink> 
</ItemTemplate> 

 

protected void Page_Load(object sender, EventArgs e) 
{ 
    lvTest.DataSource = Enumerable.Range(0, 5); 
    lvTest.DataBind(); 
} 
 

, wenn Sie Möchten Sie die Datenquelle mit dem Literal mischen, können Sie dies folgendermaßen tun:

<asp:HyperLink ID="test" NavigateUrl='<%#"http://google.pl?page=" + Container.DataItem %>' runat="server">test</asp:HyperLink> 

Sie sollten Eval anstelle von Container.DataItem verwenden, wenn Sie auf bestimmte Eigenschaften zugreifen möchten. Übrigens ist das alles schlechte Praxis. Sie sollten das ItemDataBound (oder ein ähnliches Ereignis) verwenden und mit stark typisiertem C# -Code binden.

+0

+1 es funktioniert, aber der Schlüssel ist der Aufruf von DataBind(). Sie benötigen kein Steuerelement mit einer DataSource. Siehe meine aktualisierte Antwort. – m0sa

+0

Das Aufrufen von DataBind ohne Datenquelle ist völlig sinnlos, außer in einigen Hacky-Situationen, um Workaround-Grenzen in ASP.NET zu vermeiden. – Stilgar

+0

Warum rufen Sie es dann an? – m0sa

3

Sie können so etwas wie folgt verwenden:

Html Teil der Seite:

<asp:HyperLink ID="test" NavigateUrl="<%# GetUrl() %>" runat="server">test</asp:HyperLink> 

-Code hinter:

protected string GetUrl() 
{ 
    //Put your logic here to generate dynamicly url that you want 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    DataBind(); 
} 

Hoffe, dass es Ihnen helfen.

Mit freundlichen Grüßen, Dima.

Verwandte Themen