2009-05-28 4 views
4

저는 ASP.NET에 처음 접했고 최근에 중계기를 발견했습니다. 어떤 사람들은 그들을 사용하고, 다른 사람들은 그렇지 않으며 어떤 해결책이 최선의 방법이 될지 모르겠습니다.ASP.NET 중계기 문제 (모범 사례에 대한 + 질문)

내가 경험 한 것부터 단순한 조작 (목록 표시)이 간단하지만 복잡한 작업을 수행하는 즉시 논리가 현저히 복잡해집니다.


문제 :

은 아마 개념의 날 나를 이해 부족 (이 가능성이 높다), 그래서 여기에 내가 뭘하려고 오전의 예를 나의 문제 일이다 내가 원하는 폴더에있는 파일 목록을 표시합니다.

솔루션는 :

String fileDirectory = Server.MapPath("/public/uploaded_files/"); 
String[] files = Directory.GetFiles(fileDirectory); 
repFiles.DataSource = files; 
repFiles.DataBind(); 

<asp:Repeater ID="repFiles" runat="server" OnItemCommand="repFiles_ItemCommand" > 
     <ItemTemplate> 
      <a href="/public/uploaded_files/<%# System.IO.Path.GetFileName((string)Container.DataItem) %>" target="_blank">View in a new window</a> 
      <br /> 
     </ItemTemplate> 
</asp:Repeater> 

이 잘 작동합니다.


새로운 문제 : 그 파일을 삭제 할 수 있어야합니다.

솔루션 : 나는 이벤트 잡을

<asp:LinkButton ID="lbFileDelete" runat="server" Text="delete" CommandName="delete" /> 

: 나는 항목 템플릿에서 삭제 링크를 추가

protected void repFiles_ItemCommand(object source, RepeaterCommandEventArgs e) 
     { 
      if (e.CommandName == "delete") 
      { 
       // ... blah 
      } 
     } 

을 ... 다음 무엇을? e.Item.DataItem이 null임을 알기 위해 여기에서 제거 할 파일 경로를 어떻게 얻습니까? (디버거를 실행했습니다).

루프를 사용하여 동일한 작업을 수행 할 수 있었을 때 리피터를 사용하여 시간을 낭비 했었습니까? 단지 단순한 것일뿐입니다.

다른 솔루션보다 리피터를 사용하면 어떤 점이 가장 좋은가요?

답변

9

표시하고있는 것처럼 LinkButton 이벤트를 확실히 처리 할 수 ​​있습니다. 이처럼하는 LinkButton에 CommandArgument를 추가 할 수 있습니다

<asp:LinkButton CommandArgument="<%# (string)Container.DataItem %>" ID="lbFileDelete" runat="server" Text="delete" CommandName="delete" /> 

그런 다음 코드에서이 작업을 수행 할 수 있습니다

일반적으로
string path = e.CommandArgument.ToString(); 

, 내가 Repeater 컨트롤의 팬입니다. 제한된 코드와 생성 된 HTML에 대한 높은 수준의 제어로 신속하게 반복 작업을 수행 할 수 있습니다. GridView와 다른 복잡한 컨트롤보다 더 선호합니다. 필요한만큼 정확하게 출력물을 생성 할 수있는 미세 조정 된 기능을 가지고 있기 때문입니다.

생성 된 HTML을 만들기 위해 코드에서 많은 수의 HTML을 추가하지 않으면 더 빨리 오류를 줄일 수 있다고 생각하기 때문에 반복하는 것이 더 좋습니다.

+1

이렇게 생성 된 HTML에 대한 제어는 Repeater의 큰 이점입니다. – JasonS

+0

하지만 뭔가를 할 때도 제어 할 수 있습니다. foreach thing <% = "some HTML"%> -. 실제로 더 많은 통제가 있습니다. – marcgg

+0

@jerSchneid, 귀하의 솔루션을 시도하고 목록을 표시 할 것으로 예상되는 페이지 이동 : 파서 ​​오류 설명 :이 요청을 처리하는 데 필요한 리소스를 구문 분석하는 동안 오류가 발생했습니다. 다음의 특정 구문 분석 오류 세부 정보를 검토하고 소스 파일을 적절하게 수정하십시오. 파서 오류 메시지 : 서버 태그가 제대로 구성되지 않았습니다. – marcgg

2

일람의 목록을 표시 할 때 일반적으로 리피터는 GridViews, DataLists 및 다른 카운터 파트보다 빠릅니다. 리피터는 레코드 추가 및 편집보다는 디스플레이에 가장 적합하지만 CRUD 작업에 Repeater를 사용하는 데 필요한 것을 수동으로 연결할 수 있습니다.

예에서 파일 경로를 링크 단추의 CommandArgument 속성에 바인딩해야합니다. 그런 다음 이벤트 처리기에서 e.CommandArgument를 사용하여 경로에 액세스해야합니다.

1

반복기는 자체 코드를 추가하지 않기 때문에 유사한 옵션보다 빠르고 유연합니다. 어느 정도까지, 그것들은 영광스러운 for 루프입니다, 비록 그것이 같은 장소에 모든 html 코드를 유지하기 때문에 아마 repeater를 사용하는 것이 더 좋을 것이라고 생각합니다.

0

리피터 락. 특히 이러한 종류의 기능을 마무리하는 사용자 컨트롤의 리피터.

아무리해도 CommandArgument 트릭은 특히 하나의 인수 만 필요로 할 때 매우 효과적입니다. 또 다른 트릭은 항목을 별도의 핸들러 (ItemCommand 핸들러가 아님)에 연결 한 다음 보낸 사람을 사용하여 항목으로 다시 이동하여 다른 데이터를 가져 오는 것입니다. 예 : 더 복잡한 시나리오에서

protected void DeleteFile(object sender, EventArgs e) 
{ 
    LinkButton clicked = (LinkButton)sender; 
    Control container = clicked.NamingContainer; 
    int id = int.Parse(((Hidden)container.FindControl("FileId")).Value); 
    //do stuff with the id, etc. 
} 

꽤 편리 :

<asp:LinkButton CommandArgument="<%# (string)Container.DataItem %>" ID="lbFileDelete" runat="server" Text="delete" OnClick="DeleteFile" /> 
<asp:Hidden runat="server" id="FileId" value="<%# DataBinder.Eval(Container.DataItem, "ID") %> 

그리고 코드 숨김한다. 솔직히 ASP.NET에서 리피터와 독창성으로는 할 수없는 것을 발견하지 못했습니다.

관련 문제