2012-04-13 101 views
0

我使用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後調用。

回答

0

你的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

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頁