ASP.Net에서 클라이언트에 많은 확인란을 보내는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/235608

문제

나는 다음과 같은 상황에 처해 있습니다.

사용자는 페이지에서 특정 필터를 정의하고 포스트백 시 해당 필터를 사용하여 데이터베이스를 쿼리하고 일치하는 레코드 묶음을 사용자에게 반환합니다. 각 레코드 옆에는 체크박스가 표시되어 사용자가 각 레코드에 대해 조치를 취할지 여부를 선택할 수 있습니다. 그 기록 중.

클래식 ASP/PHP에서는 "chk__*"라는 이름의 컨트롤을 많이 생성한 다음 포스트백에서 모든 $"chk" 접두사가 붙은 항목을 찾는 POST 항목".

ASP.Net 2.0에서 이를 수행하는 가장 좋은 방법은 무엇입니까?

확인란이 포함된 템플릿으로 반복기를 구현하고 반복기를 데이터 세트에 바인딩한 다음 두 번째 포스트백에서 다음을 수행하면 쉽게 수행할 수 있습니다.

For Each it As RepeaterItem In repContacts.Items
    Dim chkTemp As CheckBox = DirectCast(it.FindControl("cbSelect"), CheckBox)
    If chkTemp.Checked Then

    End If
Next

그러나 이것은 근소한 거대한 Viewstate를 제공하는 것의 단점은 클라이언트가 전체 viewstate를 서버에 다시 업로드해야 하고 이 사람들이 아마도 형편없는 연결을 통해 내 사이트를 사용할 것이기 때문에 정말 나쁜 것입니다.

다른 아이디어가 있나요?(또한 예전처럼 컨트롤을 동적으로 생성하고 Request.Form을 통해 반복할 수도 있지만 더 깔끔한 방법을 찾고 있었습니다.

도움이 되었습니까?

해결책

클래식 ASP에서 한 것과 같은 방식으로 수행하십시오. 사용u003Cinput type="checkbox"> 대신에u003Casp:checkbox> . request.form을 사용하여 원시 포스트 매개 변수에 액세스 할 수 있습니다

다른 팁

CheckBoxList 컨트롤을 살펴 보셨습니까? 데이터 세트에 바인딩하고 텍스트 멤버 및 값 멤버 항목을 제공 할 수 있으며 어떤 항목을 쉽게 확인할 수 있는지 쉽게 확인할 수 있습니다. 필요한 경우 더 많은 확인란 항목을 동적으로 추가 할 수 있습니다.

터무니없는 뷰 스테이트 조건에 직면 할 때 클래식 ASP 솔루션을 권장합니다. 그것이 제공하는 멋진 기능을 잃어버린 것은 슬픈 일이지만 결합합니다. 약간 ViewState 활성화 된 컨트롤 (ASP :*)은 일부 고전적인 기술 (입력 유형 = "...")을 절약했습니다. 많은 과거의 두통.

때로는 단순한 일을하고 싶고 간단한 솔루션은 "wysiwyg"양식 편집을 능가합니다.

제가 수행한 작업 중 하나는 세션에서 AJAX를 통해 검사 상태를 기록한 다음 포스트백(AJAX를 통해 전체 또는 부분)에서 세션에서 선택한 작업을 수행할 항목을 찾는 것입니다.

기본 아이디어는 관련 항목의 ID를 알고 있는 확인란에 onclick 핸들러를 추가하는 것입니다.클릭 시 핸들러에서 이 ID를 AJAX를 통해 서버에 다시 전달하고 세션에 기록합니다. 항목을 선택 취소할 수 있도록 확인란 상태도 전달해야 합니다.제출 컨트롤의 핸들러가 세션에서 선택된 항목에 대한 데이터를 사용하도록 합니다.

이 방법을 사용하면 선택된 항목이 있는 페이지를 렌더링(전체 또는 부분)할 때 세션에서 확인란의 초기 값을 설정할 수 있으므로 페이징된 데이터도 처리할 수 있습니다.

다음과 같이 보일 수도 있습니다.PageMethods(및 ScriptManager)가 포함된 ASP.NET AJAX를 가정합니다.

<script type='text/javascript'>
   function record(checkbox,item)
   {
       var context = { ctl : checkbox };
       PageMethods.Record(item,checkbox.checked,onSuccess,onFailure,context);
   }

   function onSuccess(result,context)
   {
      // do something, maybe highlight the row, maybe nothing
   }

   function onFailure(error,context)
   {
       context.ctl.checked = false;
       alert(error.get_Message());
   }
</script>


...
<tr><td><input type='checkbox' onclick='record(this,"item_1");'></td><td>Item 1</td></tr>
...

Codebehind

[WebMethod(EnableSessionState=true)]
public static void Record( string itemName, bool value )
{
     List<string> itemList = (List<string>)Session["Items"];
     if (itemList == null)
     {
        itemList = new List<string>();
        Session["Items"] = itemList;
     }
     if (itemList.Contains(itemName) && !value)
     {
         itemList.Remove(itemName);
     }
     else if (!itemList.Contains(itemName) && value)
     {
         itemList.Add(itemName);
     }       
}

protected void button_OnClick( object sender, EventArgs e )
{
     List<string> itemList = (List<string>)Session["Items"];
     if (itemList != null)
     {
         foreach (string item in itemList)
         {
             // do something with the selected item
         }
     }
}

ViewState를 비활성화합니다. 완료 할 수없는 경우 사용해보십시오 뷰 상태를 저장하는 세션

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top