2011-05-06 2 views
1

비슷한 code example for a custom CheckBoxList을 기반으로 정렬되지 않은 목록으로 렌더링하는 사용자 정의 RadioButtonList를 만들었습니다.사용자 정의 RadioButtonList가 PostBack에서 값을 잃습니다.

하지만 다시 게시를 수행 할 때 어떤 이유로 내 선택한 항목이 저장되지 않습니다. 내가 오버라이드 유일한 방법은 렌더링-방법 :

[ToolboxData("<{0}:ULRadioButtonList runat=server></{0}:ULRadioButtonList>")] 
public class ULRadioButtonList : RadioButtonList { 
    protected override void Render(HtmlTextWriter writer) { 
     Controls.Clear(); 

     string input = "<input id={0}{1}{0} name={0}{2}{0} type={0}radio{0} value={0}{3}{0}{4} />"; 
     string label = "<label for={0}{1}{0}>{2}</label>"; 
     string list = "<ul>"; 

     if (!String.IsNullOrEmpty(CssClass)) { 
      list = "<ul class=\"" + CssClass + "\">"; 
     } 

     writer.WriteLine(list); 

     for (int index = 0; index < Items.Count; index++) { 
      writer.Indent++; 
      writer.Indent++; 

      writer.WriteLine("<li>"); 

      writer.Indent++; 

      StringBuilder sbInput = new StringBuilder(); 
      StringBuilder sbLabel = new StringBuilder(); 

      sbInput.AppendFormat(
       input, 
       "\"", 
       base.ClientID + "_" + index.ToString(), 
       base.UniqueID, 
       base.Items[index].Value, 
       (base.Items[index].Selected ? " checked=\"\"" : "") 
      ); 

      sbLabel.AppendFormat(
       label, 
       "\"", 
       base.ClientID + "_" + index.ToString(), 
       base.Items[index].Text 
      ); 

      writer.WriteLine(sbInput.ToString()); 
      writer.WriteLine(sbLabel.ToString()); 

      writer.Indent = 1; 

      writer.WriteLine("</li>"); 

      writer.WriteLine(); 

      writer.Indent = 1; 
      writer.Indent = 1; 
     } 

     writer.WriteLine("</ul>"); 
    } 
} 

내가 뭔가를 잊어 버리셨습니까? 일반 ASP.NET RadioButtonList를 사용하는 경우 선택한 항목이 포스트 백 이후에 저장되므로 내 값을 재정의하는 것이 없습니다. 그것은 커스텀 컨트롤과 관련이 있습니다.

답변

0

이러한 접근 방식을 사용하려면 생성 마크 업에서 name (및 id) 속성을 RadioButtonList으로 일치시켜야합니다. 그래서 코드에서 명백한 문제는 name 속성의 값입니다 - 즉

대신 또한
... 
sbInput.AppendFormat(
      input, 
      "\"", 
      base.ClientID + "_" + index.ToString(), 
      base.UniqueID + index.ToString(), // <<< note the change here 
      base.Items[index].Value, 
... 

"_"ID 생성, 당신은 ClientIdSeparator 속성을 사용한다 각 라디오 버튼의 인덱스가 추가되어야한다.

마지막으로 ASP.NET 컨트롤이 태그를 생성하는 방식에 변화가 있다면 본질적으로 깨지기 쉽기 때문에 이러한 컨트롤 작성 방식에 대해 조언해야합니다. 예를 들어 ASP.NET에서 클라이언트 ID 생성 논리를 구성 할 수 있으므로 ID 생성 논리가 기본 컨트롤에서 생성 된 원래 마크 업과 일치하도록 올바르게 작동하지 않을 수 있습니다.

+0

라디오 버튼의 목적이 아닌 여러 개의 라디오 버튼을 선택할 수 있기 때문에 이름 속성은 목록의 모든 라디오 버튼에 대해 동일해야합니다. – thomasvdb

+0

@thomasvb, 예 - 이름 속성 변경을 제안하는 데 잘못이있었습니다. 크로스 체크 만하고 ASP.NET도 같은 이름 속성을 생성합니다. 이 경우 문제는 ID 생성과 관련 될 수 있다고 생각합니다. 렌더링 구현에 주석을 달고 라디오 버튼에 대해 생성 된 ID를보고 렌더링 구현에 의해 생성 된 ID와 비교해 볼 것을 제안합니다. – VinayC