0

我正在使用 ASP.Net MVC2。当从 Jquery Ajax post call 调用控制器时,我试图打开一个新的视图窗口。这是我的代码..在 ascx 页面中..

$('#DeleteButton').click(function () {

            var isLineChecked = $(':checkbox:checked', '#providerSearchResultsTable').length;

            if (isLineChecked == 0) {
                alert("Please select at least one row ");
                return false;
            }

            else {

                var params = {
                    Id: gaiSelected.join(',')

                };

                alert(params);
                $.ajax({

                    type: "Post",
                    url: "SelectProviderAndContact",
                    data: params,
                    success: function (html) {
                        **//$('#SelectProviderAndContact').html(html);**
    }
                });

            }
 });

这是我的控制器动作方法

[SessionFilter]
        public ActionResult SelectProviderAndContact(string Id)
        {
            try
            {
                List<ProviderBaseInfo> providerList = null;
                string[] internalProviderIDs = Id.Split(",".ToCharArray());
                //string[] billingProviderNames = billingProvider.Split(",".ToCharArray());

                IStateBag stateBag = _commonModel.GetStateBag();
                //stateBag.SetValue("InternalProviderId", Id);
                List<Guid> internalProviderIds = new List<Guid>();
                foreach (var a in internalProviderIDs)
                {
                    internalProviderIds.Add(new Guid(a));
                }

                List<Contacts> providerContactList = _providerModel.GetProviderContactlist(internalProviderIds);

                if (providerContactList.Count <= 0)
                {
                     //IStateBag stateBag = GetStateBag();
                    List<ProviderBaseInfo> providers = (List<ProviderBaseInfo>)stateBag.GetValue(ProviderListCache);

                if (providers == null)
                {
                    providerList = _providerModel.GetProviderCompleteList(null, null, null, null, Id).ToList();

                }
                else
                {
                    providerList = providers.Where(x => internalProviderIds.Contains(x.InternalProviderId)).ToList();
                }

                providerContactList = _providerModel.GetContactlistbyInsertingProviders(providerList);
                }

                ViewData["ProviderNotFound"] = false;

               // ViewData["ProviderName"] = new SelectList(billingProvider.Select(x => new { value = x, text = x }), "value", "text");
                var Provider = new[] { 
                new { ProviderId = "A", Providername = "A" }
                //new DataContracts.RegionKeyValues { RegionId = "B", RegionValue = "B" }, 
                //new DataContracts.RegionKeyValues { RegionId = "D", RegionValue = "D" } 
            };
                ViewData["ProviderName"] = new SelectList(Provider, "ProviderId", "Providername");

                **return View("SelectProviderAndContact",providerContactList);**



            }
            catch (FaultException<MedicareFault> ex)
            {
                if (ex.Code.Name == typeof(ArgumentException).Name)
                {
                    ViewData["ProviderNotFound"] = true;
                    ViewData["Error"] = ex.Reason;
                    return View((object)null);
                }
                else
                {
                    ViewData["Error"] = Errors.Common.UnknownError;
                    return View((object)null);
                }
            }
            catch
            {
                ViewData["Error"] = Errors.Common.UnknownError;
                return View((object)null);
            }
        }

我已经SelectProviderAndContact.aspx在视图中创建了。

请任何人帮助我SelectProviderAndContact.aspx 从ajax post call打开另一个窗口。

4

2 回答 2

0

您的 jquery 将不得不完成几乎所有打开窗口的工作。使用window.open()您的 javascript 中的方法,您可以使您的控制器发回一个特定的参数,使其打开一个带有特定 URL(即TheSmallPopupPageThatViewsResults.aspx?resultId=12345或其他东西)的新窗口。

您的控制器将决定是否告诉视图打开新窗口,然后视图将在被告知时打开它。

对于您的特定实现,您可能必须创建一个模型或将结果存储在数据库中的东西,以便控制器可以保存结果,然后用于弹出页面的操作和视图可以访问该结果。另一种方法是让调用弹出页面的参数确定在页面上查看的内容。这将消除对另一个模型的需要,但是如果您有大量数据,您的网址可能会变得非常长,而且我相信这些网址的长度通常是有限制的。

我建议使用 JSON 或 XML 将数据返回到 javascript,以便您可以根据需要扩展返回的对象。我过去所做的方式是制作几个 XML 标记,如<alert>, <refresh>, <redirect>,<somePageSpecificAction>等,我使用 jquery 解析这些标记$(theEnclosingTag).each( function () { //...parse here })

我主要使用MVC3,所以我不知道MVC2是否支持它,但是将ActionResult更改为JsonResult作为返回类型并使用return this.Json(new { put = "data here" });你的return语句使得使用json变得非常容易。

此外,使用不同的操作方法来处理 ajax 请求可能是有益的。然后,您将有一个显示页面的操作,另一个处理来自该页面的 ajax 请求的操作(可以用 [HttpPost] 或其他东西装饰),以及弹出页面视图的另一种方法。这也将使您的代码更简短且更易于阅读。当您尝试查找特定错误的位置时,拥有较长的控制器方法可能会在以后变得非常混乱。

编辑:一个具体的例子:假设MVC3(因为这是我使用的......我认为你可以找到其他方法......你可以使用xml序列化程序并只输出xml)你有你的页面(行动#1 ) 显示所有按钮和东西(这是你的 javascript 包含 $("#DeleteButton") 的地方,等等)。您的 javascript 使用一些返回类型为 JsonResult 的参数对另一个操作(SelectContactAJAX 或其他操作...这是操作 #2)进行 AJAX 调用。您的 javascript 从特定于 ajax 的操作中获取响应,并且响应告诉它“打开一个带有 URL /SelectContactForm?choiceId=12345 的窗口”(或其他内容)。choiceId 是一个参考,将在后台用于 SelectContactForm 操作(另一个单独的操作...操作 #3)以了解要显示的内容。

至于获取用户在新窗口中输入的内容并让原始页面做出反应的反馈,javascript 中有多种方法可以监听窗口关闭等,但我从来没有在我的一个应用程序中使用过它这有点超出了这个问题的范围。

于 2012-04-13T16:14:04.407 回答
0

使用彩盒 jquery 插件

http://www.jacklmoore.com/colorbox

在 .aspx 页面中编写代码以调用 .ascx 页面

  parent.$.fn.colorbox({ href: '/IGTR/SaveIGTRPreference/' + id + '?t=' + Math.random(), height: "400", width: "800", overlayClose: false, escKey: false
        });

这里 SaveIGTRPreference 是 .ascx 页面

于 2012-04-18T05:31:45.140 回答