打开一个新的窗口,当从Jquery Ajax调用控制器后调用

打开一个新的窗口,当从Jquery Ajax调用控制器后调用

问题描述:

我使用ASP.Net MVC2。我试图打开一个新的窗口,当从Jquery Ajax调用呼叫控制器。 这里是我的代码.. 在ASCX页..打开一个新的窗口,当从Jquery Ajax调用控制器后调用

$('#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后调用。

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

你的控制器会决定是否告诉视图打开新窗口,然后如果告诉视图,视图会打开它。

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

我建议使用JSON或XML将数据返回给JavaScript,以便可以根据需要扩展返回的对象。我过去的做法是制作几个XML标签,例如<alert>,<refresh>,<redirect>,<somePageSpecificAction>等,我使用$(theEnclosingTag).each(function() { //...parse here })来解析jquery。我使用的主要是MVC3,所以我不知道这是否支持MVC2,但更改ActionResult为返回类型的JsonResult和使用return this.Json(new { put = "data 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中有各种方式来侦听窗口关闭等,但我从来没有必要在我的应用程序中使用它,这有点超出了这个问题的范围。

+0

感谢您的很多解释。你能给我任何例子,以达到上述条件,这将是很大的帮助 – user1245777 2012-04-13 19:01:50

+0

我在上面添加了一个更具体的例子。我希望它有帮助 – 2012-04-14 20:00:44

使用颜色框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页