현재 디자인 접근 방식에서는 나중에 데이터베이스 판독 및 데이터 바인딩을 수행해야하는 경우가 있습니다. 페이지 수명주기. 사용자에게 최종 결과는 동일하지만 장면 뒤에서 두 가지 불필요하고 값 비싼 작업을 수행하고 있습니다.마스터 페이지의 검색 버튼을 사용하면 페이지 수명주기의 정보가 늦게 검색됩니다.
검색 버튼은 마스터 페이지에 있습니다. 모든 디스플레이 컨트롤 (gridviews/tables/labels/etc)은 콘텐츠 페이지에 있습니다. 데이터베이스 호출과 데이터 바인딩은 Page_Init() 메소드에서 수행되어야합니다 (사용되는 대부분의 컨트롤은 여기에 바인딩되어야합니다).
사용자가 항목을 검색 할 때 검색 입력을 세션에 저장하여 다른 모든 콘텐츠 페이지에서 계속해서 볼 수 있도록합니다. 그래서 어떤 콘텐츠 페이지가 초기화 될 때, 나는 그들이 적극적으로 항목을보고 있는지 확인하고, 그렇다면 그의 세부 사항을 표시합니다.
// Master Page
protected void BtnSearch_OnClick(object sender, EventArgs e)
{
MySession.Current.ItemName = TxtItem.Text.Trim();
Server.Transfer("~/default.aspx");
}
// Content Page
protected void Page_Init(object sender, EventArgs e)
{
// If they're actively viewing an item, display its info
bool HasActiveItem = string.IsNullOrEmpty(MySession.Current.ItemName) ? false : true;
if (HasActiveItem)
{
// Makes one DB call to get all info;
// Binds all that info to GridViews/tables/labels on the page
BindAllDataControls(MySession.Current.ItemName);
// Display
DisplayItemDetails();
}
}
문제가 여기에있다 : 사용자가 현재 항목 = 부츠를보고 말한다. 이 값은 세션에 저장됩니다. 이제 사용자는 Item = Shirts을 검색하고 검색 버튼을 클릭합니다.
콘텐츠 페이지가로드되면 세션에 항목이 있는지 확인하지만 그 내용은 입니다. 항목 = 부츠입니다. 그것은 불필요한 데이터베이스/databind 호출을 수행합니다. 그런 다음 BtnSearch 클릭 이벤트가 트리거되면 새로운 Item = Shirts 값을 세션에로드하고 수명주기를 시작합니다. 이 수명주기가 좋습니다.
어떻게 처리해야합니까? 접근 방식이 잘못 되었습니까?
콘텐츠 페이지 초기화 중에 Page.IsPostback() 및 Page.IsCallback() 논리를 수행하는 것에 대해 생각했지만 실제 웹 응용 프로그램에서 포스트 백 및 콜백을 발생시키는 여러 다른 컨트롤이 있습니다. 따라서 나는 건너 뛸 것인지의 여부를 결정하기에 충분한 정보를 얻을 수 없다고 생각합니다. 나는 모든 GridViews/테이블/레이블/등이 포함 된 페이지의 전체 부분을 래핑하는 방법에 대해 생각해 보았습니다. 아약스 Callback에서, 그러나 나는 그것이 좋은 접근법이라고 생각하지 않는다. 나는 플래그를 설정 BtnSearch 클릭하는 동안 서버에 다시 아약스 전화를 보내는 것에 대해 생각했습니다. 그런 다음로드하는 동안 해당 플래그를 건너 뛰거나 읽지 만 BtnClick 검색 이벤트 전에 ajax 호출이 처리한다는 보장이 없습니다.
아이디어가 있으십니까? 또는 나는이 여분 외침을 먹고 그것으로 끝나야 하는가? 다른 방법이 있어야합니다.
입력 해 주셔서 감사합니다.viewstate가 Init() 이벤트가 발생할 때까지 컨트롤에로드되지 않았으므로 (PreLoad() 이벤트 직후에로드 됨)이 작동하지 않을 것이라고 생각합니다. 따라서 컨트롤을 초기화해야 할 때 검색 상자에서 새로운 값을 읽을 수는 없습니다. – bdizzle
@bdizzle 포스트 백에서 컨트롤은 폼의 입력을받습니다. 이것이 작동하지 않는 경우 양식에서 직접 읽으십시오. – Aristos
양식에 대한 좋은 제안. 아마이 방법을 사용할 것입니다. 감사. – bdizzle