Asp.net mvc 3 将Fancybox与ASP.NET MVC Ajax结合使用

Asp.net mvc 3 将Fancybox与ASP.NET MVC Ajax结合使用,asp.net-mvc-3,fancybox,Asp.net Mvc 3,Fancybox,我有一个在fancybox中加载的表单,因此如果用户单击链接,一个表单就会加载到fancybox中,它是一个@Ajax.BeginForm。像这样: @using (Ajax.BeginForm("AddToBasket", new { controller = "Orders" }, new AjaxOptions() { InsertionMode = InsertionMode.Replace, UpdateTargetId = "SuccessBasket", O

我有一个在fancybox中加载的表单,因此如果用户单击链接,一个表单就会加载到fancybox中,它是一个@Ajax.BeginForm。像这样:

@using (Ajax.BeginForm("AddToBasket", new { controller = "Orders" }, new AjaxOptions()
{
    InsertionMode = InsertionMode.Replace,
    UpdateTargetId = "SuccessBasket",
    OnSuccess = "goToCheckout"   
}, new { @class = "product-order-form" }))
{

@* Form elements for Model *@

<div id="SuccessBasket"></div>
}
我有一个名为ModalWindow的空div,它被一个div集合包装为display:none,按照说明:

<div style="display: none">
    <div id="ModalWindow">
    </div>
</div>
其中basket是我的模型BasketModel basket=新BasketModel

My _OrderProductPartialView是我文章开头包含Ajax表单的视图。其中有SuccessBasket div

到目前为止,它工作得非常好。表单加载到fancybox中

AddToBasket操作返回PartialView:

return PartialView("_OrderProduct", basket);
return PartialView("_BasketSuccess");
此视图仅告诉用户他们的项目已添加到购物篮中:

<p>This item has been added to your basket. Search again or goto @Html.ActionLink("checkout", "Order", new { controller = "Orders" }, new { @class = "checkout-link" }) to continue.</p>

问题是,SuccessBasket div没有用上面的文本更新,但是通过调试,我可以看到它确实加载了视图_BasketSuccess,它只是没有在模式窗口中更新。

加载fancybox的方式很奇怪。您将发送两个AJAX请求:一个用于AJAX.ActionLink,另一个用于fancybox。所有这些都不是必需的。此外,在主视图中不需要隐藏div,fancybox会自动完成所有这些操作

总而言之,在主视图中,您只需要一个指向控制器actin的简单HTML链接,它将返回一个包含表单的部分:

@Html.ActionLink("Order", "OrderProduct", "Orders", null, new { @class = "lightbox" })
在一个单独的javascript文件中,您将fancybox附加到该锚定上,这样当它被单击时,它将自动发送一个AJAX请求fancybox,而不是您,获取部分表单并显示它:

$(function () {
    $('.lightbox').fancybox();
});

好的,现在你有了一个fancybox中显示的部分形式。这个部分表单实际上是一个Ajax.BeginForm。因此,当您提交此表单时,它将向AddToBasket操作发送一个AJAX请求,一旦成功,它将使用此操作返回的结果更新表单中的内容。

加载fancybox的方式很奇怪。您将发送两个AJAX请求:一个用于AJAX.ActionLink,另一个用于fancybox。所有这些都不是必需的。此外,在主视图中不需要隐藏div,fancybox会自动完成所有这些操作

总而言之,在主视图中,您只需要一个指向控制器actin的简单HTML链接,它将返回一个包含表单的部分:

@Html.ActionLink("Order", "OrderProduct", "Orders", null, new { @class = "lightbox" })
在一个单独的javascript文件中,您将fancybox附加到该锚定上,这样当它被单击时,它将自动发送一个AJAX请求fancybox,而不是您,获取部分表单并显示它:

$(function () {
    $('.lightbox').fancybox();
});

好的,现在你有了一个fancybox中显示的部分形式。这个部分表单实际上是一个Ajax.BeginForm。因此,当您提交此表单时,它将向AddToBasket操作发送一个AJAX请求,一旦成功,它将使用此操作返回的结果更新表单中的内容。

您能提供更多详细信息吗?这张表怎么装?你是怎么打开fancybox的?控制器操作的结果是什么?goToCheckout函数做什么?你能提供更多细节吗?这张表怎么装?你是怎么打开fancybox的?控制器操作的结果是什么?goToCheckout函数做什么?谢谢,这解决了我的问题,我用Html.ActionLink替换了我的OrderProduct链接的Ajax.ActionLink。这对我不起作用。它没有显示对话框,而是将对话框部分显示为页面:|谢谢,这解决了我的问题,我用Html.ActionLink替换了我的OrderProduct链接的Ajax.ActionLink。这对我不起作用。它不显示对话框,而是将对话框部分显示为页面:|