您的控制器可以返回 JSON(但您将需要某种模板 - 如下所述 - 能够仅填充值。或者让您的控制器返回 html 并通过 javascript 替换您需要的页面部分。
在您的 html 中,您可以执行以下操作:
<div id='loader'>Loading...</div>
<div id='popup'>This will be replaced</div>
<header></header>
<nav></nav>
<secton id='content'></section>
<footer></footer>
确保将这两个 div 隐藏在你的 CSS 中:div#loader, div#popup { display: none; }
将z-index
加载程序的 设置为小于z-index
弹出窗口的 。
在你的标签中设置一个属性a
来指定每个标签是否应该打开一个弹出窗口:
<a href='your/url' data-pops>Click me</a>
现在将所有这些锚点单击事件绑定到一个函数来处理这个问题:
$('a[href]').click(function() {
var self = this;
var url = $(self).attr('href');
if($(self).attr('data-pops')) {
showPopup(url);
} else {
loadContentPartial(url);
}
});
如果该data-pops
属性存在,它将showPopup
从锚点调用具有指定 url 的函数。否则,它将执行对loadContentPartial
此处命名的函数的调用,您可以更新您的内容。
您的showPopup
函数可以执行以下任务:
- 显示装载机。
- 执行一个
$.get
.
- 如果您的 get 仅返回 json(我建议您使用 knockoutjs - 一个 mvvm 框架)
- 如果您的 get 返回原始 html:当 get 完成后,将弹出 div 的内容替换为从
$.get
.
- 不要隐藏加载程序并显示弹出窗口。(加载器图像/图标/文本将不可见,因为弹出窗口将在其上方 - 保持灰色覆盖以避免用户交互)
您的loadContentPartial
函数应该执行与显示弹出窗口几乎相同的任务,不同之处在于它应该替换您的部分内容然后隐藏加载程序。
注意这里有点作弊,您可以执行整个页面请求,在这里将返回的内容替换为当前页面内容,您的请求会更大一些,但现在返回 30k 或 10k 并不是那么重要,如果你是当然,不是 Facebook。
现在:您可以从控制器编写 html,或者甚至更好地编写一些辅助方法来生成要返回的原始 html,包括表单、按钮、字段和您可能需要的所有内容。如果你选择使用 Knockout js,周围有几个教程,这里是Brad Wilson 在 NDC(挪威开发者大会)上记录的对我来说最好的教程。它非常易于使用、学习和实施。您可以将Handlebarsjs
自己称为Minimal 类固醇模板,我从未使用过它,但这里是链接,K Scott Allen 在 Pluralsight 中有一个很棒的教程(像往常一样),称为ASP.NET MVC4 Fundamentals。
如果您有任何机会需要弹出窗口的加载器,您可以执行以下操作之一:
- 更改
z-index
覆盖加载器的,然后在弹出窗口完成处理后将其更改回来。
- 创建另一个覆盖加载器,例如
div#popupLoader
并设置一个z-index
高于div#popup
.