从Jquery Ajax调用后调用控制器时打开一个新的视图窗口

时间:2012-04-13 14:11:35

标签: asp.net asp.net-mvc-2 jquery

我正在使用ASP.Net MVC2。当我从Jquery Ajax调用调用控制器时,我正在尝试打开一个新的视图窗口。 这是我的代码.. 在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的电话会议。

2 个答案:

答案 0 :(得分:0)

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

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

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

我建议使用JSON或XML将数据返回到javascript,以便您可以根据需要扩展返回的对象。我过去的方式是使用<alert><refresh><redirect><somePageSpecificAction>等多个XML标记,我使用{{1}进行jquery解析}。

我主要使用MVC3所以我不知道MVC2是否支持它,但是将ActionResult更改为JsonResult以获取返回类型并使用$(theEnclosingTag).each( function () { //...parse here })作为返回语句使得使用json非常容易。

此外,使用不同的操作方法处理ajax请求可能会有所帮助。然后,您将有一个显示该页面的操作,另一个用于处理来自该页面的Ajax请求的操作(可以使用[HttpPost]或其他东西进行修饰),以及另一个用于弹出页面视图的方法。这也可以使您的代码简短易读。当您尝试查找特定错误的位置时,使用较长的控制器方法可能会在以后发生混乱。

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

至于获得用户在新窗口中输入的内容并让原始页面做出反应的反馈,javascript中有各种方式来监听窗口关闭等等,但是我从来没有必要在其中一个我的申请,这有点超出了这个问题的范围。

答案 1 :(得分:0)

使用colorbox 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页面