2013-07-21 2 views
1

ASP.NET 4.5의 모델 바인딩 기능을 사용하여 ListView에 표시된 제품 목록에서 FormView 컨트롤로 단일 제품의 세부 정보를로드하려고합니다. .모델 바인딩을 사용하여 모델을 ASP.NET FormView에 수동으로 바인딩

이 모두는 단일 뷰 ASP 페이지에서 호스팅되며 멀티 뷰 컨트롤을 사용하여 표시 할 것을 결정합니다. 한보기에서 모든 제품을 표시하는 ListView가 있습니다. 다른보기에서 FormView 컨트롤을 사용하여 단일 제품의 세부 정보를 표시/편집 할 수 있습니다. ListView에서 하나의 제품 레코드를 클릭하면 FormView가 포함 된 뷰를 표시하고 편집 또는 검토를 위해 해당 제품을 FormView에로드하려고합니다.

WebForms의 모델 바인딩 방향에 따라 ProductId를 매개 변수로 사용하는 메서드로 FormView의 "SelectMethod"속성을 정의했습니다. 이 메서드는 해당하는 단일 Product 객체를 반환합니다. 이 메서드의 페이지 수명주기 어딘가에 호출되고 FormView가 자동으로로드된다는 것은 제 이해입니다.

이제 ListView에서 레코드를 클릭하여 세부 정보를 볼 때 ItemCommand 이벤트 처리기를 시작합니다. 이벤트 핸들러는 선택된 레코드의 제품 ID를 사용하고이 ID에 해당하는 제품을 검색합니다.

문제는 그 제품을 FormView에 바인딩해야한다는 점에서 문제가됩니다. FormView를 바인딩하는 모델로 제품을 수동으로 지정하려면 어떻게합니까?

"DataSource or DataSourceID cannot be defined on 'ProductForm' when it uses model binding."

다른 사람을 가지고이 유사한 문제를 가지고 그것을 처리하는 방법을 알아 냈 : 나는 수동으로 FormView의 데이터 소스를 설정하려고 할 때 나는 오류가?

감사합니다,

G

답변

2

가 수동으로 데이터 바인딩 때문에 제품을 할당 할 필요가 없습니다 당신이 다리 작업을 처리합니다. 첫째

, 당신은 선택의 명령 이름과의 ListView의 각 행의 버튼의 어떤 종류가 있는지 확인하십시오 FormView의 경우 SelectMethod가 있는지 확인을 위해,

<asp:ListView ID="ProductList" runat="server" DataKeyNames="Id" ItemType="Product" SelectMethod="GetProductList"> 
<ItemTemplate> 
    <%# Item.Name %> 
    <asp:Button ID="SelectButton" runat="server" CommandName="Select" /> 
</ItemTemplate> 
</asp:ListView> 

둘째는 제품 ID 매개 변수는 컨트롤을 가지고 생성자에 전달 된 문자열리스트 뷰 컨트롤의 ID와 일치해야합니다 경우 지정 속성 : 당신이 선택 버튼을 ListView에 변화의 SelectedValue와 GetProduct 방법을 클릭하면 있기 때문에, 할 필요가 전부

public Product GetProduct([Control("ProductList")] int? id) 
{ 
    if (id.HasValue) 
    { 
     return GetProductList().First(p => p.Id == id.Value); 
    } 
    return null; 
} 

자동으로 호출되고 FormView가 업데이트됩니다.

+0

그랬어! 나는 "Control"속성을 알지 못했다. 고맙습니다!! –