Gridview исчезает при нажатии на ссылку - PullRequest
0 голосов
/ 17 января 2012

У меня действительно ненадежная ситуация, когда мой 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] : добавлен некоторый код по запросу. Первоначально не делал этого, так как я полагал, что код, возможно, не проблема. Работает в одной версии, а не в другой.

1 Ответ

1 голос
/ 18 января 2012

Разобрался с проблемой. Это разница между безопасным веб-сайтом и тем, который не существует, на самом деле разница была * http *** s ** и http , да, именно s является причиной проблемы. Причина в том, что я перепривязываю источник данных на OnInit, чтобы при нажатии на ссылку создавалось и запускалось событие. Это было решением, которое кто-то предложил на вопрос , который я задал некоторое время назад.

То, что я делал, было так:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    // if being redirected from another page, remove the search attributes
    // so it doesn't load the Search Grid view
    if (Page.Request.UrlReferrer != Page.Request.Url)
    {
        Session[UNMGeneralConstants.SearchAttributes] = null;
    }

    UserManagementBO userManagementBO = new UserManagementBO();
    dsUserInSites = userManagementBO.GetSitesNameForUser(new Guid(Session[SessionVariables.Ses_UserId].ToString()));

    DataSet dsSearchResults2 = Session[UNMGeneralConstants.SearchAttributes] as DataSet;
    if (dsSearchResults2 != null && dsSearchResults2.Tables.Count != 0)
    {
        gvExistingPatientsSearch.DataSource = dsSearchResults2;
        gvExistingPatientsSearch.DataBind();
    }
    else
    {
        gvExistingPatientsSearch.DataSource = null;
        gvExistingPatientsSearch.DataBind();
    }
}

это был оператор if (Page.Request.UrlReferrer != Page.Request.Url), который вызывал проблему, поскольку у UrlReferrer было https, а у URL нет. Вместо этого я переключил оператор if на if(Page.Request.UrlReferrer.LocalPath != Page.Request.Url.LocalPath). Кажется, работает после тестирования.

Надеюсь, это окончательное решение, и у меня больше не будет проблем. Предложения и комментарии приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...