使用 jQuery 和 MVC 加载纯 HTML 片段
本文介绍了一种使用 jQuery 和 MVC 从 Web 服务器加载干净的 HTML 片段的简单方法。
引言
本文介绍了一种使用 jQuery 和 MVC 从 Web 服务器加载干净的 HTML 片段的简单方法。
背景
"jQuery" 的一个强大功能是从服务器加载一些 HTML 片段并将它们插入到网页中。但是大多数创建 HTML 内容的方法都是为了创建 HTML 页面,这些页面很可能包含 HTML 标签,如 "<body>" 和 "<head>"。如果你查看我之前的文章 "五种不同的 jQuery AJAX 调用方式的工作示例",你可能会注意到,为了生成干净的 HTML 片段,我编写了一些相当“丑陋”的代码,并使用 "HttpResponse.OutputStream()" 将 HTML 内容发送到 Web 浏览器。实际上,当使用 "MVC" "ViewUserControl" 时,这是一项更简单的任务。本文将使用一个简单的示例向你展示如何生成干净的 HTML 片段以及如何将它们加载到网页中。

附件的 Visual Studio 解决方案有一个简单的“MVC 2”Web 应用程序“jQueryPartialView
”,它包含以下主要组件
- "ApplicationModel.cs" 实现了应用程序的数据模型。
- "HomeController.cs" 实现了 "MVC" 应用程序的 "控制器"。
- "Index.aspx" 是应用程序的主网页。
- "LoadStudents.ascx" 是 "MVC" "ViewUserControl",它生成 HTML 片段,这些片段将由 "Index.aspx" 中实现的 "javascript" 代码加载。
Visual Studio 解决方案是在 Visual Studio 2010 中创建的,"jQuery" 版本是 "1.4.4"。在本文中,我将首先介绍数据模型和 "MVC" "控制器"。然后我将向你展示 "LoadStudents.ascx" 是如何实现的。之后,我将讨论 HTML 片段是如何加载到 "Index.aspx" 页面中的。让我们首先看一下数据模型。
数据模型
此应用程序中的数据模型在 "ApplicationModel.cs" 文件中实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace jQueryPartialView.Models
{
public class Student
{
public int ID { get; set; }
public string Name { get; set; }
public int Score { get; set; }
public DateTime GraduationTime { get; set; }
}
}
这可能是任何应用程序最简单的数据模型。它只有一个类 "Student
"。此类将由 "LoadStudents.ascx" 用于生成包含 "Student
" 对象 "List" 信息的干净 HTTP "table" HTTP 片段。
MVC 控制器
"MVC" "控制器" 在 "HomeController.cs" 文件中实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using jQueryPartialView.Models;
namespace jQueryPartialView.Controllers
{
[HandleError]
public class HomeController : Controller
{
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index()
{
return View();
}
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult LoadStudents(int NoOfStudents)
{
List<Student> Students = new List<Student>();
Random rd = new Random();
for (int i = 1; i <= NoOfStudents; i++)
{
Student student = new Student();
student.ID = i;
student.Name = "Name No." + i.ToString();
student.Score = Convert.ToInt16(60 + rd.NextDouble() * 40);
student.GraduationTime = DateTime.Now;
Students.Add(student);
}
return View(Students);
}
}
}
在此控制器中,实现了两个 "ActionResult" 方法
- "
Index
" 方法加载应用程序的主网页 "视图" "Index.aspx" - "
LoadStudents
" 方法加载 "ViewUserControl" "LoadStudents.ascx"。此方法接受输入参数 "NoOfStudents
" 并创建随机生成的 "Student
" 对象 "List"。此 "List" 作为视图模型传递给 "LoadStudents.ascx"。
"ViewUserControl" "LoadStudents.ascx"
"ViewUserControl" "LoadStudents.ascx" 用于在此应用程序中生成干净的 HTML 片段
<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Student>>" %>
<table cellspacing="0px" cellpadding="4px">
<tr>
<th>ID</th><th>Name</th><th>Score</th><th>GraduationTime</th>
</tr>
<% foreach (var item in Model) { %>
<tr>
<td><%: item.ID %></td>
<td><%: item.Name %></td>
<td><%: item.Score %></td>
<td><%: item.GraduationTime.ToShortDateString() %></td>
</tr>
<% } %>
</table>
如果你将这个 "ViewUserControl" 与 "五种不同的 jQuery AJAX 调用方式的工作示例" 中用于生成 HTML 片段的“丑陋”代码进行比较,你会对其简洁性感到惊讶。这是一个“强类型”的 "ViewUserControl"。它接受一个 "Student
" 对象 "List" 并遍历它以生成 HTML "table" 的 HTML 片段。此处生成的 HTML 片段将由 "Index.aspx" 页面中的 "javascript" 代码加载。
应用程序的主网页 "Index.aspx"
应用程序的主网页是 "Index.aspx"。"LoadStudents.ascx" 生成的 HTML 片段通过 "javascript" 使用 "jQuery" 加载到此页面。
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Load clean html fragment</title>
<link rel="stylesheet"
href="<%: Url.Content("~/Content/Styles/Site.css") %>"
type="text/css" />
<link rel="stylesheet"
href="<%: Url.Content("~/Content/Styles/TableStyle.css") %>"
type="text/css" />
<script src='<%: Url.Content("~/Content/Scripts/jquery-1.4.4.min.js") %>'
type="text/javascript">
</script>
</head>
<body>
<div id="MainContainer">
<div id="InputTrigger">
<span>Please select the number of the students to retrieve</span>
<span>
<select id="selNoOfStudents">
<option>***</option>
<option>1</option>
<option>5</option>
<option>10</option>
<option>20</option>
<option>100</option>
</select>
</span>
<img id="imgGetStudents"
src="<%: Url.Content("~/Content/Images/arrow.png") %>"
alt="" />
</div>
<div id="HTMLContent"></div>
</div>
</body>
</html>
<script type="text/javascript">
var aquireStudentsURL = '<%: Url.Action("LoadStudents", "Home") %>';
var ajaxLoadImgURL = '<%: Url.Content("~/Content/Images/ajax-load.gif") %>';
$(document).ready(function () {
var $MainContent = $("#HTMLContent");
var $selNumberOfStudents = $("#selNoOfStudents");
var ajaxLoadImg = "<img src='" + ajaxLoadImgURL + "' alt='Loading ...'/>";
$("#imgGetStudents").click(function (e) {
e.preventDefault();
var numberOfStudents = $selNumberOfStudents.val();
if (numberOfStudents == "***") {
alert("Please select the number of the students to retrieve");
return;
}
var resourceURL = aquireStudentsURL + "?NoOfStudents=" + numberOfStudents;
$MainContent.html(ajaxLoadImg);
$.ajax({
cache: false,
type: "GET",
async: false,
url: resourceURL,
dataType: "text/html",
success: function (htmlFragment) {
$MainContent.html(htmlFragment);
},
error: function (xhr) {
alert(xhr.responseText);
}
});
});
$selNumberOfStudents.change(function () {
$MainContent.html("");
});
});
</script>
此网页是一个简单的 "视图" 页面。主要 HTML 组件如下
- "<select>" 控件 "
selNoOfStudents
" 允许用户选择从 "ViewUserControl" "LoadStudents.ascx" 检索的学生数量。 - "<img>" 控件 "
imgGetStudents
" 显示图片 "arrow.png"。此图片是一个绿色箭头,在此应用程序中用作“按钮”。单击此图片将触发一个 "ajax" 调用,根据 "selNoOfStudents
" 下拉框中的学生数量加载从 "LoadStudents.ascx" 生成的 HTML 片段。 - 如果 "ajax" 调用成功,则接收到的 HTML 片段将插入到 "<div>" "
HTMLContent
" 中。
"Index.aspx" 的 "javascript" 部分也非常简单。在 "$(document).load()
" 事件中,注册了 "<img>" "imgGetStudents
" 的点击事件。当 "imgGetStudents
" 被点击时,JavaScript 代码首先从 "<select>" 控件 "selNoOfStudents
" 获取要检索的学生数量,然后向服务器发出 "ajax" 调用。收到 HTML 片段后,"<div>" "HTMLContent
" 中的内容将更新以显示收到的学生信息。
运行应用程序
现在我们完成了这个简单的 "MVC" Web 应用程序,我们准备好进行测试运行。当此 Web 应用程序首次加载时,"Index.aspx" 会显示在 Web 浏览器中。我们可以看到 "<div>" "HTMLContent
" 指定的屏幕区域是空的。

选择要检索的学生数量并单击箭头图像,将触发 "ajax" 调用以从 "ViewUserControl" "LoadStudents.ascx" 加载 HTML 片段。下图显示了收到 100 名学生时的屏幕

我使用 "Fiddler" 查看了网络流量。"LoadStudents.ascx" 生成的 HTML 片段确实是干净的。以下是 "Fiddler" 在加载单个学生时捕获的 HTTP 内容

关注点
- 本文介绍了一种使用 "jQuery " 和 "MVC" 从 Web 服务器加载干净 HTML 片段的简单方法。
- 生成 HTML 片段的方法有很多,本文中使用的方法应该是最“简单”的方法之一。
- 我希望你喜欢我的帖子,也希望这篇文章能或多或少地帮助你。
历史
- 这是本文的第一个修订版。