这个
XMLHttpRequest
javascript中的对象(实际上是“ajax”请求)就是所谓的“瘦客户机”。您的Web浏览器是一个“厚客户端”,它不仅仅是发出请求和接收响应:它实际上是自动执行一些操作,例如获取返回的HTML、CSS和JavaScript并“运行”它们,构建一个DOM,并向屏幕呈现漂亮的图片和文本。相反,瘦客户机只是发出请求并接收响应。就是这样。它自己什么都不做。作为开发人员,您有责任使用响应来实际做一些事情。
在这里的例子中,这意味着获取您收到的响应,并操纵DOM以用检索到的不同游戏会话替换游戏会话列表。如何做到这一点取决于作为Ajax调用响应返回的确切内容。它可以是HTML,可以随时插入,也可以是JSON之类的对象。在前一种情况下,您只需在DOM中选择一些父元素,然后用收到的响应替换它的innerhtml。在后一种情况下,您需要使用JSON数据来实际构建元素并将其插入到DOM中。
直接返回HTML更容易,但也不太灵活。返回JSON给了您最终的自由,但要操作DOM来显示数据则更加困难。这通常是您想要使用诸如Vue、Angular、React等客户端框架的地方。所有这些都可以创建模板化组件。这样,您只需要更改基础数据源(即将数据设置为返回的JSON),组件将相应地做出反应,根据需要操纵DOM来创建视图。
我个人喜欢使用Vue,因为它在开始使用时摩擦最小,使用起来几乎太简单了。例如:
<div id="App">
<input type="date" v-model="startDate" />
<button type="button" v-on:click="filterGameSessionsByDate">Find</button>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.GameName)
</th>
<th>
@Html.DisplayNameFor(model => model.PlayDuration)
</th>
</tr>
</thead>
<tbody>
<tr v-for="item in items">
<td>{{ item.GameName }}</td>
<td>{{ item.PlayDuration }}</td>
</tr>
</tbody>
</table>
</div>
然后用一点JS把它连接起来:
(function (options) {
let vm = new Vue({
el: '#App",
data: {
items: options.items,
startDate: null
},
methods: {
filterGameSessionsByDate: function () {
let self = this;
$.ajax({
type: "POST",
url: options.filterByDateUrl,
data: "startdate=" + self.startDate,
success: function (data) {
self.items = data;
}
});
}
}
});
})(
@Html.Raw(Json.Encode(new {
items = Model,
filterByDateUrl = Url.Action("GamingSessionsByDate", "GameSession")
}))
)
如果你不习惯JS,这看起来可能有点奇怪。我只是在使用这里所说的闭包:在适当的地方定义和调用一个函数。它需要一个
options
参数,由底部的括号填充。在这些内容中,我创建了一个匿名对象,其中包含我需要的信息,例如要显示的初始项和从中获取筛选结果的URL。然后,该对象被编码成JSON并转储到页面。