2017-10-02 21 views
0

채울 확인란 목록이 있으며 아마도 page_load를 사용하여 작업을 수행 할 수 있습니까? Web Forms 모델 바인딩 CheckBoxList가로드시 미리 선택됨

protected void Page_Load(object sender, EventArgs e) 
{ 
    //... 
    var query = logic.GetPlanCoverages(planName); 
    cbl_MemberCoverages.DataSource = coverages; 
    cbl_MemberCoverages.DataBind(); 
} 

그러나 Asp.Net이 모델은 지금이 가질 수 바인딩 도입했기 때문에 :

<asp:CheckBoxList runat="server" ID="cbl_MemberCoverages" 
SelectMethod="BindMemberCoverages" DataTextField="CoverageName" DataValueField="CoverageCode"> 
</asp:CheckBoxList> 

을 그리고 숨김 코드 :

public IEnumerable<PlanCoveragesDomainModel> BindMemberCoverages() 
{    
    var planName = logic.GetShortPlanName(); 
    var query = logic.GetPlanCoverages(planName); 
    return query; 
} 

하지만 ...이 Model Binding에서 여전히 좋아하지 않는 무언가, 또는 양식을 미리 채워야 할 때 제대로 사용하는 방법을 제대로 이해하지 못하는 것일 수도 있습니다.

일반적인 시나리오는 사용자 목록에서 편집하려는 경우입니다. 새 페이지를 열면 많은 필드가있는이 양식을 채 웁니다. 아마 사용자 중 한 명은 이미 이러한 보상 범위 중 일부를 할당했습니다. 하지만 현재로서는 내가 찾은 유일한 해결 방법은 다음과 같습니다.

public IEnumerable<PlanCoveragesDomainModel> BindMemberCoverages([QueryString]string mode) 
    { 
     if (!"edit".Equals(mode, StringComparison.InvariantCultureIgnoreCase)) 
     { 
      var planName = logic.GetShortPlanName(); 
      var query = logic.GetPlanCoverages(planName); 
      return query; 
     } 

     var coverages = logic.GetPlanCoverages(CurrentModel.PlanName).Select(c => new ListItem(c.CoverageName, c.CoverageCode)).ToArray(); 
     cbl_MemberCoverages.Items.AddRange(coverages); 
     cbl_MemberCoverages.DataSource = coverages; 
     cbl_MemberCoverages.DataBind(); 

     foreach (ListItem listItem in cbl_MemberCoverages.Items) 
     { 
      listItem.Selected = CurrentModel.Coverages.Any(c => c.Value == listItem.Value); 
     } 
     return null; 
    } 

사람들, 아이디어가 있습니까?

+0

당신은 모델 바인딩이있는 사용자를 편집 할 수 있지만 다른 사용자의 값 형태로 미리 채워 갖고 싶어? 이것은 처음에는 모델 바인딩이라는 개념과 반대되는 것처럼 보이지만 컨트롤에 바인딩하기 전에 사용자 객체의 데이터를 미리 채우는 것이 더 쉬울 수도 있습니다. – Seano666

+1

내가 이해하면 ... 내가 원하는대로, '편집'을 클릭하고 편집 페이지로 이동 한 후 탐색 페이지에서 선택한 'MemberCoverage'를 편집 페이지에서 선택한 것으로 표시하겠습니까? –

+0

[Henryk Budzinski] 정확히 무슨 뜻인지 :) –

답변

1

CheckBoxList 컨트롤에 대해 OnDataBound 이벤트를 구현하십시오.

<asp:CheckBoxList runat="server" ID="cbl_MemberCoverages" 
    SelectMethod="BindMemberCoverages" DataTextField="CoverageName" 
    DataValueField="CoverageCode" 
    OnDataBound="cblMemberCoverages_DataBound"> 
</asp:CheckBoxList> 

코드

protected void cblMemberCoverages_DataBound(object sender, EventArgs e) 
{ 
    var chkBoxList = sender as CheckBoxList; 
    var item = chkbox.Items.FindByValue(queryStringCoverageCode); 
    if(item != null) 
     item.Selected = true; 
} 
+0

왜 Databound 이벤트를 제외 시켰는지 알 수 없습니다. 고맙습니다 :) –