博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[翻译]ASP.NET MVC 3 开发的20个秘诀
阅读量:6413 次
发布时间:2019-06-23

本文共 7739 字,大约阅读时间需要 25 分钟。

议题

单击链接的时候,由于网页刷新内容需要重新加载,会感觉整个过程变的非常缓慢,尤其在我们只需要更新少量内容的时候感觉更加明显。

 

解决方案

修改之前的示例,将Html.ActionLink 创建的链接更改为由Ajax辅助类Ajax.ActionLink创建,使链接点击时只加载需要改变的内容。

 

讨论

MVC框架提供了几个非常棒的辅助类。在目前为止本书使用最后的就是HtmlHelper类,几乎之前所有的视图类都至少使用过一次。在这个秘诀中,将使用AjaxHelper辅助类替换BooksIndex视图中所有的HtmlHelper辅助类。

 

要想实现Ajax视需要一点额外的设置才能使用的。通常情况下,也正是这点儿额外的工作阻止了开发人员使用它。但是我认为花费额外的时间去实现它是值得的,因为这将使用户在使用时获得非常好的体验。

 

在程序的配置文件Web.config文件中,设置ClientValidationEnabled和UnobtrusiveJavaScriptEnabled值为True

...
...

完成最后的配置步骤,需要包含几个Javascript文件。这些文件需要在各个视图中共享使用,在Views/Shared/_Layout.cshtml文件中,将这两个Javascript文件包含到<head>标记中:

   @ViewBag.Title 
@RenderBody()

将这些文件自动嵌入到MVC3应用程序中,也就完成了Ajax核心功能的配置。接下来,我们需要修改Books/Index视图。在下面的示例中,修改了三个过滤器链接和列首的排序链接,用Ajax.ActionLink替换Html.ActionLink

@model PagedList.IPagedList
@if (IsAjax) {
Layout = null; }

@MvcApplication4.Resources.Resource1.BookIndexTitle

@Html.ActionLink("Create New", "Create")

Show: @if (ViewBag.CurrentFilter != "") {

@Ajax.ActionLink("All", "Index", new {
sortOrder = ViewBag.CurrentSortOrder, Keyword = ViewBag.CurrentKeyword }, new AjaxOptions { UpdateTargetId = "main" }) } else {
@:All }   |   @if (ViewBag.CurrentFilter != "NewReleases") {
@Ajax.ActionLink("New Releases", "Index", new {
filter = "NewReleases", sortOrder = ViewBag.CurrentSortOrder, Keyword = ViewBag.CurrentKeyword }, new AjaxOptions { UpdateTargetId = "main" }) } else {
@:New Releases }   |   @if (ViewBag.CurrentFilter != "ComingSoon") {
@Ajax.ActionLink("Coming Soon", "Index", new {
filter = "ComingSoon", sortOrder = ViewBag.CurrentSortOrder, Keyword = ViewBag.CurrentKeyword }, new AjaxOptions { UpdateTargetId = "main" }) } else {
@:Coming Soon }

@using (Html.BeginForm()) {
@:Search: @Html.TextBox("Keyword")
} @Html.Partial("_Paging")
@foreach (var item in Model) {
}
@Ajax.ActionLink("Title", "Index", new {
sortOrder = ViewBag.TitleSortParam, filter = ViewBag.CurrentFilter, Keyword = ViewBag.CurrentKeyword }, new AjaxOptions { UpdateTargetId = "main" })
@Ajax.ActionLink("Isbn", "Index", new {
sortOrder = ViewBag.IsbnSortParam, filter = ViewBag.CurrentFilter, Keyword = ViewBag.CurrentKeyword }, new AjaxOptions { UpdateTargetId = "main" })
Summary @Ajax.ActionLink("Author", "Index", new {
sortOrder = ViewBag.AuthorSortParam, filter = ViewBag.CurrentFilter, Keyword = ViewBag.CurrentKeyword }, new AjaxOptions { UpdateTargetId = "main" })
Thumbnail @Ajax.ActionLink("Price", "Index", new {
sortOrder = ViewBag.PriceSortParam, filter = ViewBag.CurrentFilter, Keyword = ViewBag.CurrentKeyword }, new AjaxOptions { UpdateTargetId = "main" })
@Ajax.ActionLink("Published", "Index", new {
sortOrder = ViewBag.PublishedSortParam, filter = ViewBag.CurrentFilter, Keyword = ViewBag.CurrentKeyword }, new AjaxOptions { UpdateTargetId = "main" })
@Html.DisplayFor(modelItem => item.Title) @Html.DisplayFor(modelItem => item.Isbn) @Html.DisplayFor(modelItem => item.Summary) @Html.DisplayFor(modelItem => item.Author) @Html.DisplayFor(modelItem => item.Thumbnail) @Html.DisplayFor(modelItem => item.Price) @Html.DisplayFor(modelItem => item.Published) @Html.ActionLink("Edit", "Edit", new { id = item.ID }) | @Html.ActionLink("Details", "Details", new { id = item.ID }) | @Html.ActionLink("Delete", "Delete", new { id = item.ID })
@Html.Partial("_Paging")

在这里最关键的是ActionLink方法最后的一个参数AjaxOptions。当用户点击这个Ajax链接时,Ajax请求会更新ID为“main”的HTML标签。如果仔细看了之前更改的共享布局的页面,会发现它包含一个ID"main"的标记。事实上,这个是@RenderBody()方法在视图中输出的内容的容器。

 

同时我们在视图的顶部做了一个非常重要的检测,如果Ajax请求完成,则将Layout属性设置为空。这是一个非常重要的设置,因为Ajax请求并不是只是包含视图的内容,而是会包含整个布局的内容,这样就会将整个布局再次放入到当前布局中。

 

为了完成这个示例,需要将Shared/Pageing视图修改为使用AjaxHelper类实现:

 

@if (Model.HasPreviousPage) {

@Ajax.ActionLink("<< First", "Index", new {
page = 1, sortOrder = ViewBag.CurrentSortOrder, filter = ViewBag.CurrentFilter, Keyword = ViewBag.CurrentKeyword }, new AjaxOptions { UpdateTargetId = "main" }) @Html.Raw(" "); @Ajax.ActionLink("< Prev", "Index", new {
page = Model.PageNumber - 1, sortOrder = ViewBag.CurrentSortOrder, filter = ViewBag.CurrentFilter, Keyword = ViewBag.CurrentKeyword }, new AjaxOptions { UpdateTargetId = "main" }) } else {
@:<< First @Html.Raw(" "); @:< Prev }    @if (Model.HasNextPage) {
@Ajax.ActionLink("Next >", "Index", new {
page = Model.PageNumber + 1, sortOrder = ViewBag.CurrentSortOrder, filter = ViewBag.CurrentFilter, Keyword = ViewBag.CurrentKeyword }, new AjaxOptions { UpdateTargetId = "main" }) @Html.Raw(" "); @Ajax.ActionLink("Last >>", "Index", new {
page = Model.PageCount, sortOrder = ViewBag.CurrentSortOrder, filter = ViewBag.CurrentFilter, Keyword = ViewBag.CurrentKeyword }, new AjaxOptions { UpdateTargetId = "main" }) } else {
@:Next > @Html.Raw(" ") @:Last >> }

现在,当用户点击更改书籍列表的链接,更新书籍列表整个页面将不会重新载入,这样为用户提供了更快、更好的用户体验。

 

此外,如果客户端不支持Javascript(例如,当搜索引擎检索访问时),链接依然可以正常工作,即使是用户禁止了Javascript或者搜索引擎仍然可以通过链接访问当一个正常的完整的页面重载的内容。

 

参考

  

ASP.NET MVC

posted @  O2DS 阅读(335) |  

posted @  O2DS 阅读(835) |  

posted @  O2DS 阅读(951) |  

posted @  O2DS 阅读(961) |  

posted @  O2DS 阅读(1011) |  

posted @  O2DS 阅读(757) |  

posted @  O2DS 阅读(1152) |  

posted @  O2DS 阅读(835) |  

posted @  O2DS 阅读(1304) |  

posted @  O2DS 阅读(923) |  

posted @  O2DS 阅读(1198) |  

posted @  O2DS 阅读(1122) |  

posted @  O2DS 阅读(1880) |  

转载地址:http://fvdra.baihongyu.com/

你可能感兴趣的文章
[shell 命令] find 查找文件
查看>>
windows下启动mysql服务的命令行启动和手动启动方法
查看>>
VTK三维点集轮廓凸包提取
查看>>
【概率论与数理统计】小结9-3 - 区间估计
查看>>
Golang性能调优入门
查看>>
sqlloader外部表
查看>>
golang笔记——数组与切片
查看>>
屏蔽可忽略的js脚本错误
查看>>
【Vue】vue.js常用指令
查看>>
NFS学习
查看>>
MySql常用命令总结
查看>>
又一年...
查看>>
Linux VFS
查看>>
ext不能选中复制属性_如何实现Extjs的grid单元格只让选择(即可以复制单元格内容)但是不让修改?...
查看>>
python中print的作用*8、不能+8_在 Python 3.x 中语句 print(*[1,2,3]) 不能正确执行。 (1.0分)_学小易找答案...
查看>>
python 生成html代码_使用Python Markdown 生成 html
查看>>
axure如何导出原件_Axure 教程:轻松导出图标字体所有图标
查看>>
laravel input值必须不等于0_框架不提供,动手造一个:Laravel表单验证自定义用法...
查看>>
cad填充图案乱理石_太快了吧!原来大神是这样用CAD图案填充的
查看>>
activator.createinstance 需要垃圾回收么_在垃圾回收器中有哪几种判断是否需要被回收的方法...
查看>>