ASP.NET将函数返回值从modalpopupextender传递给主窗体

时间:2017-09-20 19:31:44

标签: c# asp.net asp.net-ajax modalpopupextender

我已经查看了一些基本问题的解决方案,但没有找到任何我理解或可行的解决方案。

我有一个页面,它包含两项信息,文件名和商店。然后用户单击一个按钮来执行一个函数,该函数将更新数据库并发回一个我希望在主窗体上的文本框中显示的结果字符串。

然而,当他们按下按钮时,我使用UpdatePanel面板调用modalpopupextender。这得到了modalpopup的一个值。如果用户验证选择了正确的存储,则单击“okay”按钮,然后调用返回结果的dbprocessing函数。页面很小,所以我会给出完整的aspx和c#代码。

函数doProcess()返回一个值List,我将其转换为String以供显示。我把会话变量留在了里面,这是我最后一次试图让它工作的尝试。

我感到困惑的是,当单击主窗体(进程)上的第一个按钮时,有一个回发显然会在按钮单击之前点击页面加载。那是我显示弹出窗口的时候。然后,当用户点击按钮时,另一个回发是在点击按钮之前执行点击页面加载,在第二个按钮中我最初尝试在主页面上设置文本框,因为第二次点击后没有其他操作,但是没有数据显示。

奇怪的是,如果我重复这个过程,当我点击显示弹出窗口时,我的数据会显示出来。这没有意义。

这是aspx页面

<%@ Page Title="Product Rank Loader" Language="C#" MasterPageFile="~/OMnested.master" AutoEventWireup="true" CodeBehind="ProductRankLoader.aspx.cs" Inherits="OrderManager.ProductRankLoader" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajax" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <script type="text/javascript" src="Scripts/jquery-1.7.1.min.js"></script>
    <script type="text/javascript" src="Scripts/local.js"></script>
    <script type="text/javascript">
        function callme(thisone)
          {
                $("#ddlStores").prop('disabled', false);
          }

</script>
    <div>
        <table style="width: 500px">
            <tr>
                <td>
                    <asp:Label ID="lblMessage" runat="server"></asp:Label>
                </td>
            </tr>
            <tr>
                <td>
                    <asp:FileUpload ID="fulRanks" runat="server" Width="315px" />
                </td>
            </tr>
            <tr>
                <td>
                    <asp:DropDownList ID="ddlStores" runat="server" Height="16px" Width="155px">
                        <asp:ListItem Value="0">Select Store</asp:ListItem>
                        <asp:ListItem Value="10101">Parkseed</asp:ListItem>
                        <asp:ListItem Value="10151">Wayside</asp:ListItem>
                        <asp:ListItem Value="10201">Jackson (JP)</asp:ListItem>
                    </asp:DropDownList>
                </td>
            </tr>
            <tr>
                <td style="height: 20px; padding-top: 15px; padding-bottom: 15px; padding-left: 20px;">
                    <asp:Button ID="btnProcess" runat="server" Text="Process" Width="89px" OnClick="btnProcess_Click" />
                </td>
            </tr>
            <tr>
                <td>
                    **<asp:TextBox ID="txtResults" runat="server" Height="200px" ReadOnly="True" TextMode="MultiLine"></asp:TextBox>**
                </td>
            </tr>
        </table>
        <asp:HiddenField ID="hdnFilename" runat="server" />
    </div>

    <asp:UpdatePanel id="updVerifyChoice" runat="server">
        <ContentTemplate>
                <div style="display: none;">
                    <asp:Button ID="btnDummy" UseSubmitBehavior="true" OnClientClick="ShowModalPopup" OnClick="btnDummy_Click" runat="server" />
                    <%--Dummy Button added to assign the target controlid of PopupExtender--%>
                    <asp:Button ID="btnDummyButton" UseSubmitBehavior="true" runat="server" Text="DummyButton" Style="display: none;" />
                </div>
                    <asp:Panel ID="pnlVerifyRequestPopup" runat="server">

                        <div style="background: #fff; padding-left: 3px; border: 1px solid #989898; border-top: 1px solid #989898 !important;">
                            <table style="background-color: #F7F5F4; width: 300px;">
                                <tr>
                                    <td><label>Verify Process Request</label></td>
                                    <td style="text-align: right;">
                                        <label class="lbl_3">
                                            <asp:LinkButton ID="lBtnVerifyRequestClose" CssClass="lnkCloseheaderedit" Text="Cancel"
                                                runat="server" OnClick="lBtnBillUpdPopClose_Click" /></label>
                                    </td>
                                </tr>
                                <tr>
                                    <td style="width: 150px;" colspan="2">
                                        <asp:Label ID="lblWarn" runat="server" Text="" Font-Size="Medium" ForeColor="#CC3300"></asp:Label>
                                    </td>
                                </tr>
                                <tr>
                                    <td colspan="2" class="align_right">
                                        <asp:Button ID="btnPopVerify" runat="server" CssClass="order_searchbtn" Text="Okay"
                                            OnClick="btnPopVerify_Click" />
                                    </td>
                                </tr>
                            </table>
                            <asp:HiddenField ID="hdnReturnData" runat="server" />
                        </div>
                    </asp:Panel>
                <ajax:ModalPopupExtender ID="extVerifyProcess" runat="server" BehaviorID="extndPopBillUpdBehId"
                    TargetControlID="btnDummyButton" PopupControlID="pnlVerifyRequestPopup" CancelControlID="lBtnVerifyRequestClose">
                </ajax:ModalPopupExtender>

             </ContentTemplate>
        </asp:UpdatePanel>
</asp:Content>

应该从函数中获取返回值的相关字段称为txtResults。

这是c#代码(我删除了不需要的代码)

namespace OrderManager
{
    public partial class ProductRankLoader : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            var currentUser = Request.LogonUserIdentity.Name.Split('\\')[1];

//            Session.Add("returnText", "");

            var header = Master.FindControl("lblpageheading") as Label;
            header.Text = "Product Rank Loader";

            if (IsPostBack)
            {
                try
                {

                    //if (Session["Verified"].ToString() != "")
                    //{
                        Session["returnText"] = doProcess();
                        if (Session["returnText"].ToString() != "")
                        {
                            txtResults.Text = Session["returnText"].ToString();
                            lblMessage.Text = "";
                        }

                    //}

                }
                catch { }
            } else
            {
                Session.Add("returnText", "");
                Session.Add("Verified", "");
            }
        }

        protected void btnProcess_Click(object sender, EventArgs e)
        {

            Boolean fileOK = false;
            string filename = Path.GetFileName(fulRanks.FileName);
            hdnFilename.Value = filename;

            if (fulRanks.HasFile)
            {
                ddlStores.Enabled = true;
                String fileExtension =
                    System.IO.Path.GetExtension(fulRanks.FileName).ToLower();
                String[] allowedExtensions = { ".txt", ".log" };
                for (int i = 0; i < allowedExtensions.Length; i++)
                {
                    if (fileExtension == allowedExtensions[i])
                    {
                        fileOK = true;
                        fulRanks.SaveAs(@"c:\temp\" + filename);
                    }
                }
            }

            if (!fileOK || ddlStores.SelectedIndex <= 0)
            {
                lblMessage.Text = "Either the file name is incorrect or a store has not been selected.";
                return;
            } else { }

            lblWarn.Text = "You are going to update item Ranks for store <br />" + ddlStores.SelectedItem + ".<br /><br />Press 'Okay' to process";
            Session.Add("Verified", "true");
            extVerifyProcess.Show();

        }

        protected void lBtnBillUpdPopClose_Click(object sender, EventArgs e)
        {
            Session["Verified"] = "";
            Session["returnText"] = "";
            Response.Redirect("ProductRankLoader.aspx");
        }
        protected void btnPopVerify_Click(object sender, EventArgs e)
        {
            //Session["returnText"] = doProcess();
            Session.Remove("returnText");
            Session.Remove("Verified");
        }
        private string doProcess()
        {
            string tmpResults = "";
            Int32 store = 0;
            if (ddlStores.SelectedIndex > 0)
            {
                Int32.TryParse(ddlStores.SelectedValue.ToString(), out store);
                string filename = hdnFilename.Value;

                ProductRankLoaderDLL.ProductRankLoaderDLL newRanks = new ProductRankLoaderDLL.ProductRankLoaderDLL(xxx);

                List<string> results = newRanks.ProcessRanks();
                foreach (string result in results)
                {
                    tmpResults += result + '\r';
                }
               // txtResults.Text = tmpResults;
                lblMessage.Text = "";
            }
            else
            {
                lblMessage.Text = "";
            }
            return tmpResults;
        }

        protected void btnDummy_Click(object sender, EventArgs e)
        {

        }
    }
}

1 个答案:

答案 0 :(得分:1)

如果我不误解您的请求,您的问题是由回发引起的。我认为你可以用jquery更好地处理你的逻辑。例如,您可以使用jquery关闭弹出窗口而不执行回发:

$('#lBtnVerifyRequestClose').click(function (event) {
    event.preventDefault();
    $('#pnlVerifyRequestPopup').dialog('close');
});

event.preventDefault()确保不执行回发。 如果您需要服务器逻辑将数据放在弹出窗口中,您可以将jquery函数绑定到open事件上的对话框并检索数据/执行逻辑。这样,您的表单将在流程结束时仅提交给服务器一次。