2010-02-11 4 views
3

ASP.Net 웹 사이트가 있고 페이지 중 하나에 UserControl의 여러 반복을 렌더링하기 위해 Repeater를 사용하는 페이지 중 하나에 UserControl에 두 개의 텍스트 상자가있는 두 번째 UserContol이 있습니다. 내 사용자는 정보를 입력해야합니다. 내 사용자가 버튼을 눌러 두 번째 TextBoxes와 함께 두 번째 UserControl의 다른 인스턴스를 원래 UserControl에 추가하여 사용자가 첫 번째 UserControl 화면에 4 개의 텍스트 상자를 표시 할 수있게하려고합니다. 두 번째 UserControl을 첫 번째 주어진 반복에 추가하려고하면 나타나는 문제는 페이지 다시 게시로 인해 다른 두 번째 사용자 컨트롤이 페이지에서 삭제된다는 것입니다.Asp.Net 페이지에 UserControl 추가

누구나 JQuery를 사용하여이를 수행하는 방법을 알고 있습니까? 서버 측 동적 컨트롤 및/또는 AJAX를 사용하여이 문제를 해결하는 방법을 설명하는 3 개의 게시물이 있지만이 서버 측 메커니즘은 리소스 측면에서 너무 비싸기 때문에 JQuery 솔루션에 집중하기로 결정했습니다.

저는 아래의 Zincorp 제안에 대한 작업을 해왔습니다. 이제 JQuery가 텍스트 상자를 복제하려고했지만 서버 측 Request.Form 컬렉션을 사용하여 컨트롤을 반복하는 데 문제가있었습니다. 누구든지 Request.Form 컬렉션을 반복하는 방법에 대한 조언을 줄 수 있습니까?

좋아요, Request.Form.AllKeys 컬렉션을 사용하여 컨트롤을 반복하는 문제는 ASP TextBox 컨트롤 대신 HTML 텍스트 상자를 사용하고있는 것으로 나타났습니다. 분명히 Request.Forms.AllKeys 컬렉션에는 HTML 컨트롤이 아닌 ASP 컨트롤 만 포함되어 있습니다.

지금보고있는 문제는 JQuery에서 컨트롤을 복제 한 다음 제출 단추가있는 페이지를 제출할 때 2 개의 컨트롤이 동일한 ID를 가지므로 하나의 http로 결합 된 것입니다. ASP TextBox 두 값을 모두 포함하는 컨트롤 (쉼표 구분 기호 (예 : -40,20)). 누구든지 복제 된 ASP TextBox에 할당 된 새 ID를 얻는 방법을 알고 있습니까? 여기

샘플 ASP.Net 웹 위해 appliction에서 업데이트 된 마크 업입니다 : 여기

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
<title>Untitled Page</title> 
</head> 
<body> 
<form id="form1" runat="server"> 
<div> 
     <asp:Label runat="server" ID="ProjectDisplay" Text="Project" /> 
     <asp:TextBox ID="ProjectValue" runat="server" ></asp:TextBox> 
     <div id="mydiv" ></div> 
     <br /> 
     <br /> 
     <br /> 

    <input id="AddProject" type="button" value="Add Project" />  
     <br /> 
     <br /> 


    <asp:Button ID="Submit" runat="server" Text="Submit" onclick="Submit_Click" /> 

</div> 
</form> 
</body> 
</html> 
<script language="jquery" src="js/jquery-1.3.2.js" type="text/javascript"></script> 
<script type="text/javascript" > 

$(document).ready(function() { 

    $("#AddProject").click(function() { 

     var x = $("#ProjectValue").clone(); 

     x.appendTo("#mydiv");  
    }); 
}); 
</script> 

내가 얻을 수는 Request.Form 컬렉션의 항목을 통해 반복에 노력하고있어 업데이트 서버 측 코드는 정보 :

public partial class _Default : System.Web.UI.Page 
{ 
protected void Submit_Click(object sender, EventArgs e) 
{ 
    foreach (string s in Request.Form.Keys) 
    { 
     object x = Request.Form[s]; 
    } 
} 

} 

답변

1

문제에 대한 해결책을 선택하기 전에, 먼저 문제를 고려 :

을에 효과적으로 필요

1) 클라이언트 측

2의 컨트롤/마크 업을 중복)이 값을 구합니다 다시 게시 할 때 서버 쪽

3) 클라이언트 측에서 추가 된 "사용자 정의 컨트롤"각각에 대해 서버 쪽에서 첫 번째 사용자 정의 컨트롤의 자식으로 추가하십시오.

나는 몇 가지 아이디어를 코드를 줄 것,하지만 여기 아니에요 :

1) 마크 업이 텍스트 상자를 포함하는 UserControl을에 의해 렌더링되는 복제 jQuery의 .clone() 메소드 (http://api.jquery.com/clone/)를 사용합니다. 아마도 ID로 쉽게 얻을 수 있도록 runat = "server"가 아닌 div에 래핑하십시오. 아마도 복제 된 요소의 자식을 반복적으로 반복하고 충돌하는 식별자를 피하기 위해 #을 추가해야 할 것입니다. (예 : nameTextBox_1, nameTextBox_2 등)

2) 포스트 백에서 서버 측의 Request.Form 컬렉션을 사용하여 텍스트 상자 값을 가져옵니다. 이를 반복하고 "nameTextBox_"로 시작하는 키를 가진 모든 항목을 잡아 당깁니다.

3) 클라이언트 쪽에서 추가 된 "사용자 정의"에 대해 서버 쪽에서 실제 사용자 정의 컨트롤을 만들고 텍스트 상자에 입력 된 값을 할당 한 다음 첫 번째 컨트롤의 자식 컨트롤에 추가합니다 . 이렇게하면 상태가 사용자에게 반환 될 때 유지됩니다.

+0

zincorp, 내가 뭘하려고하는지, 그리고 1 단계에서 제안하는 것처럼 텍스트 상자를 복제하는 데 사용할 수있는 샘플 JQuery 코드 (위)가 있습니다. 요청을 반복 할 때 문제가 있습니다. 그 값을 되찾기위한 양식 콜렉션은 올바른 방향으로 나를 가리킬 수 있습니까? –

+0

죄송합니다, 내가보고있는 문제가 무엇인지 지정하는 것을 잊어 버렸습니다. 위의 코드를 디버그에서 실행하고 iterates 변수 s를 검사하면 __VIEWSTATE, __EVENTVALIDATION 및 Submit 만 표시됩니다. Object x 변수에는 항상 일부 viewstate가 있지만 그 내용을 해독 할 방법이 없습니다. –

+0

입력란에 이름을 지정하십시오 : zincorp

0

나는 viewstate 문제가 발생합니다. 동적 컨트롤이 지속되지 않습니다. 아직 읽지 않았다면 Dave Reed의 우수 기사 Truly Understanding Viewstate을 읽어보십시오. 발생하는 문제에 적용되는 "동적으로 생성 된 컨트롤을 프로그래밍 방식으로 초기화"섹션에 특히주의하십시오.

+0

감사합니다. Dave Reed의 동적 컨트롤과 뷰 상태에 대한 게시물을 살펴본 결과 매우 유용합니다. 이 문제에 대한 JQuery 솔루션을 찾기로 결정 했으므로 원래 질문을 업데이트하고 있습니다. –

1

간단히 대답하면 ViewState가 초기화되기 전에 컨트롤을 추가해야한다는 것입니다.

이 사이트의 비디오에는 동적 컨트롤 추가에 대한 유용한 가이드가 있습니다. http://www.asp.net/%28S%28wnmvzu45umnszm455c1qs522%29%29/learn/ajax-videos/video-286.aspx

+0

게시물을 보내 주셔서 감사합니다. 동영상을보고 코드를 복제했는데 제대로 작동합니다. 우리 팀과 함께 내부적으로 논의한 후, 우리는이 문제를 해결하기위한 JQuery 방법을 찾기로 결정했다. 그래서이 게시물을 업데이트하여 누군가 JQuery를 사용하여이 문제를 해결했는지 묻는다. –

1

이것은 아마도 ViewState 문제가 아닙니다. 처음에는 볼 수 있지만 그 후에는 동적 컨트롤이 실제로 각로드에서 생성되는지 확인해야합니다.

일반적으로 ViewState는 상태를 기존 컨트롤 (따라서 이름)으로 복원하는 작업 만 담당합니다. 통제를 재현 할 책임은 없습니다.

+0

@ 브라이언이 옳다. Dave Reed는 또한 다이내믹 컨트롤에 대한 심층적 인 설명을 제공합니다. 추천 해 드리겠습니다. http://weblogs.asp.net/infinitiesloop/archive/2006/08/25/TRULY-Understanding-Dynamic-Controls-_2800_Part-1_2900_.aspx –

+0

감사합니다. Dave Reed 님의 게시물을 보았습니다. 동적 컨트롤과 뷰 상태 모두 매우 유용합니다! 이 문제에 대한 JQuery 솔루션을 찾기로 결정 했으므로 원래 질문을 업데이트하고 있습니다. –

관련 문제