c#
  • asp.net
  • 2010-12-12 8 views 0 likes 
    0

    있음데이터 바인딩이 작동하지 않습니다.

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

    href 태그를 추가하지 않고 <a>test</a> 만 출력합니다. 내가 할 때 :

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

    잘 작동합니다.

    <%#"http://google.pl"%>가 작동하지 않습니까?

    어떻게 디버깅합니까?

    답변

    6

    HTML 리터럴을 ASP 컨트롤 속성으로 출력 할 수 없습니다. 코드 숨김의 하이퍼 링크 NavigateUrl 속성을 설정하거나 html 앵커를 리터럴로 출력 할 수 있습니다. 리터럴로

    출력 (이 경우는 코드 숨김 클래스를 노출해야 보호 또는 공공 재산 또는 필드 이름 UrlParams)

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

    코드 숨김에서 설정 :

    // 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; 
    } 
    

    그리고에 대한 대답하여 원래 질문. <#data-binding expression이며 서버 컨트롤 속성과 데이터 원본 사이에 바인딩을 만듭니다.

    편집 : 사실, 문자열로도 <# 구문을 사용할 수 있습니다. 작동시키기위한 핵심은 Control.DataBind() 메소드를 호출하는 것입니다. 페이지는 컨트롤에서 상속되므로 하이퍼 링크 컨트롤이나 현재 페이지에서도 호출 할 수 있습니다.

    예 : (빈 aspx 페이지에 넣고 없습니다 - 필요하지 데이터 소스) :

    <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

    어둠 속에서 찌르기이지만 <%#%> 태그는 데이터 바인딩 코드를 실행하려는 것으로 나타냅니다 (데이터베이스에서 반환 한 것과 같습니다).

    문자열 리터럴을 출력 할 필요가 없지만 수행 한 경우 해당 태그는 이 아니라 <%=이됩니다.

    +0

    '%%'를 사용하면 다음 코드가 출력됩니다 :'">test' – hsz

    +0

    이전에 NavigateUrl 속성에서이 태그를 사용하려 한 적이 없었습니다. 태그를 추가하고 곧 답변을 수정하겠다), ASP.NET 태그를 사용하여 NavigateUrl 속성에 문자열 리터럴을 지정할 필요가 없다. – jwiscarson

    +0

    예 알아 두지 만, 예를 들어 UrlParams.Google에서 해당 주소를 가져 오려고합니다. 나는 그 때하고 싶다 :'NavigateUrl = '<% = "http://google.pl"+ UrlParams.Google %>''그러나 그것은 작동하지 않는다. – hsz

    3

    실례를하지만이 실제로 작동 :

    <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(); 
    } 
     
    

    당신이 경우 데이터 원본을 리터럴과 혼합하려면 다음과 같이하십시오.

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

    특정 속성에 액세스하려면 Container.DataItem 대신 Eval을 사용해야합니다. BTW 모든 이것은 나쁜 습관입니다. ItemDataBound (또는 유사한 이벤트)를 사용하고 강력한 형식의 C# 코드를 사용하여 바인딩해야합니다.페이지

    HTML을 부분 :

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

    코드 숨김

    protected string GetUrl() 
    { 
        //Put your logic here to generate dynamicly url that you want 
    } 
    
    protected void Page_Load(object sender, EventArgs e) 
    { 
        DataBind(); 
    } 
    

    그것은 당신을 도울 것입니다 희망

    +0

    +1 작동하지만 키는 DataBind() 호출입니다. DataSource로 컨트롤이 필요하지 않습니다. 내 업데이트 답변을 참조하십시오. – m0sa

    +0

    데이터 소스가없는 DataBind를 호출하면 일부 해커 상황에서 ASP.NET의 해결 방법 제한을 제외하고는 전혀 의미가 없습니다. – Stilgar

    +0

    그럼 왜 부르는거야? – m0sa

    3

    는이 같은 것을 사용할 수 있습니다.

    감사합니다.

    관련 문제