2014-01-21 2 views
4

숨겨진 (visible="false") 패널은 포함되지 않은 요소에서 렌더링되지만 데이터 바인딩은 실행됩니다. 왜 그렇게 된거야? 더 중요한 것은 어떻게 피하는가? SelectedUsernull이다보이지 않는 asp.net 패널에서 데이터 바인딩 방지

<asp:Panel ID="UserPanel" runat="server" visible="<%# SelectedUser != null %>"> 
    <%# SelectedUser.Name %> 
</asp:Panel> 

경우, 패널이 렌더링되지 않고 SelectedUser.Name 평가되고 오류가 발생하는 경우 다음

는 성가신 일 예이다.

필자는 분명히 <%# SelectedUser != null ? SelectedUser.Name : "" %>이라고 쓸 수 있지만 혼란을 더합니다.

패널에 데이터 바인딩이 필요하지 않다는 것을 간단하고 우아하게 방지하는 방법이 있습니까?

Panel 컨트롤은 여기에 중요하지 않으며 runat="server" 인 일반 HTML 요소의 자리 표시 자일 수 있습니다.

답변

7

나는 이것에 늦을지도 모른다 그러나 나는 또한 아주 성가심 찾아 낸다.

각 항목이 다른 클래스 일 수있는 항목 목록을 렌더링하는 경우 자주이 작업이 필요합니다.이 경우 데이터 바인딩 식의 속성은 다른 클래스 유형을위한 보이지 않는 섹션에서 오류를 발생시킵니다. 당신이 이것을 원한다면 당신은 알 것입니다.

내가 찾은 가장 좋은 방법은 여기에 설명되어 있습니다 :

http://hermanussen.eu/sitecore/wordpress/2011/04/prevent-nullrefs-when-databinding-with-placeholders/

솔루션은 가시가 false 인 경우 바인딩 자식 컨트롤을 억제하는 표준 자리 표시 자 컨트롤의 간단한 재정이다 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI.WebControls; 
namespace Website.Controls 
{ 
    public class DataPlaceHolder : PlaceHolder 
    { 
     protected override void DataBindChildren() 
     { 
      if (Visible) 
      { 
       base.DataBindChildren(); 
      } 
     } 
    } 
} 
+0

이것은 좋은 해결책입니다. 'DataPlaceHolder'를 추가하는 것은 지불 할 높은 가격이 아니며 모든 것이 읽기 쉽도록 유지됩니다. 나는 그 클래스에 대해 다른 이름을 선호 할 것이다. – Mart

+0

양방향 바인딩을 중지하려면 어떻게합니까? (BindItem). 이 DataPlcaeHolder 안에 visible = false로 텍스트 상자를 놓으면. 업데이트 메소드에서 여전히 바인드를 가져오고 null 값을 가져옵니다. – Yiping

+0

아주 좋은 해결책. –

관련 문제