打开一个新的窗口,当从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中有各种方式来侦听窗口关闭等,但我从来没有必要在我的应用程序中使用它,这有点超出了这个问题的范围。
使用颜色框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页
感谢您的很多解释。你能给我任何例子,以达到上述条件,这将是很大的帮助 – user1245777 2012-04-13 19:01:50
我在上面添加了一个更具体的例子。我希望它有帮助 – 2012-04-14 20:00:44