У меня действительно ненадежная ситуация, когда мой GridView исчезает при нажатии на ссылку на нашем производственном сервере.
Работает так:
- Пользователь выполняет поиск, генерируется GridView
- При генерации страницы генерируется ссылка
- пользователь нажимает на ссылку, и GridView исчезает.
В прошлом у меня возникали проблемы, когда исчезали только ссылки, потому что ссылки создавались до конца жизненного цикла страницы. Но на этот раз все по-другому.
Что делает это еще более странным, так это то, что это происходит только на нашем рабочем / живом сервере в IIS. Если я создаю новый сайт под IIS с точно таким же скомпилированным кодом, точно такими же строками подключения к БД и т. Д., GridView работает.
Вот раздел, содержащий GridView:
<div class="PGE_SearchResult">
<asp:Panel ID="pnlWrapper" runat="server" CssClass="addSearchPanelStyle">
<asp:GridView ID="gvExistingPatientsSearch" runat="server" AutoGenerateColumns="false" DataKeyNames="PatientId" CssClass="addSearchGridViewStyle"
AlternatingRowStyle-CssClass="STD_GridView_AlternateRow" RowStyle-CssClass="STD_GridView_Row"
HeaderStyle-CssClass="gvFixedHeader" FooterStyle-CssClass="STD_GridView_Footer"
OnRowDataBound="gvExistingPatientsSearch_RowDataBound">
<Columns>
<asp:TemplateField HeaderText="Patient ID" ItemStyle-CssClass="PGS_PSR_PatientID">
<ItemTemplate>
<asp:LinkButton ID="lnkPatientSearch" runat="server" Text='<%# Bind("PatientId")%>' OnClick="OnPatientIDClick" CommandArgument='<%# Eval("PatientId")+ ";" + Eval("PatientStatus")+ ";" + Eval("DOB") + ";" + Eval("DiseaseStates") + ";" + Eval("DiseaseStateIds")%>'></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="PatientName" HeaderText="Patient Name" ItemStyle-CssClass="PGS_PSR_Site"/>
<asp:BoundField DataField="DOB" HeaderText="Date of Birth" HtmlEncode="False" ItemStyle-CssClass="PGS_PSR_DOB"/>
<asp:TemplateField HeaderText="Site(s)" SortExpression="Site" ItemStyle-CssClass="PGS_PSR_Site">
<ItemTemplate>
<asp:Label ID="lblSiteSearch" runat="server" Text='<%# Bind("Site")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="SiteMRN" HeaderText="Site MRN" HtmlEncode="False" ItemStyle-CssClass="PGS_PSR_DOB"/>
<asp:TemplateField HeaderText="Disease State(s)" ItemStyle-CssClass="PGS_PSR_Site">
<ItemTemplate>
<asp:Panel ID="diseaseStatePanel" runat="server">
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
Код, который генерирует строки для GridView, таков:
protected void gvExistingPatientsSearch_RowDataBound(object sender, GridViewRowEventArgs e)
{
DataRowView patientData = (DataRowView)e.Row.DataItem;
string diseaseStates = patientData["DiseaseStates"] as string;
string diseaseStateIds = patientData["DiseaseStateIDs"] as string;
int PatientID = (int)patientData["PatientId"];
int patientStatus = (int)patientData["PatientStatus"];
DateTime DOB = DateTime.Parse(patientData["DOB"] as string);
if (e.Row.RowIndex != -1)
{
e.Row.Cells[2].Enabled = true;
LinkButton lnkPatientSearch = (LinkButton)e.Row.FindControl("lnkPatientSearch");
lnkPatientSearch.Enabled = false;
Panel diseaseStatePanel = (Panel)e.Row.FindControl("diseaseStatePanel");
BuildDiseaseStateLinks(diseaseStatePanel, diseaseStates, diseaseStateIds, PatientID, patientStatus, DOB, true);
}
}
Ниже приведен метод BuildDiseaseStatelinks()
private void BuildDiseaseStateLinks(Panel diseaseStatePanel, string diseaseStates, string diseaseStateIDs, int PatientID, int patientStatus, DateTime DOB, bool isAllowed)
{
string[] diseaseStateIdsSplit = diseaseStateIDs.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
string[] diseaseStateSplit = diseaseStates.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < diseaseStateSplit.Length; i++)
{
string diseaseState = diseaseStateSplit[i];
string diseaseStateID = diseaseStateIdsSplit[i];
LinkButton diseaseStateLink = new LinkButton();
diseaseStateLink.Attributes.Add("style", "float:left");
diseaseStateLink.Text = diseaseState;
diseaseStateLink.CommandArgument =
PatientID + "|" + patientStatus + "|" + DOB.ToShortDateString() + "|" + diseaseState + "|" + diseaseStateID;
if (isAllowed)
{
diseaseStateLink.CommandArgument += "|Allowed";
}
else
{
diseaseStateLink.CommandArgument += "|NotAllowed";
}
diseaseStateLink.CommandName = "OnDiseaseStateLinkClick";
diseaseStateLink.Command += new CommandEventHandler(OnDiseaseStateLinkClick);
diseaseStatePanel.Controls.Add(diseaseStateLink);
if (i < diseaseStateSplit.Length - 1)
{
Label splitLabel = CreatePipeLabel();
diseaseStatePanel.Controls.Add(splitLabel);
}
}
}
gvExistingPatientsSearch
связывается в 2 местах, когда нажата кнопка поиска, и на Page_Load
, но только если пользователь был перенаправлен на текущую страницу с поиском как QueryString
.
После нажатия на ссылку устанавливаются несколько переменных Session
(найденные в CommandArguments
, заданном в BuildDiseaseStateLinks
, и пользователь перенаправляется на другую страницу.
Что я мог упустить? Код тот же, БД та же, настройки IIS идентичны (за исключением пулов приложений, один использует классический (Prod / Live), а другой - интегрированный; я переключил Prod / Live на интегрированный, но ничего не сделал .
Предложения, комментарии, что угодно!
Заранее спасибо.
[EDIT] : добавлен некоторый код по запросу. Первоначально не делал этого, так как я полагал, что код, возможно, не проблема. Работает в одной версии, а не в другой.