【译】MVC3 20个秘方-(13)使用Ajax Helper 提高用户体验

前端之家收集整理的这篇文章主要介绍了【译】MVC3 20个秘方-(13)使用Ajax Helper 提高用户体验前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

http://www.cnblogs.com/techborther/archive/2011/12/01/2270625.html


问题

当你点击链接时,整个的网页都被重新加载。尤其是你仅仅一小点内容需要被更新时,这将被感觉是一个很慢的过程。

解决方

更新之前创建的HTML.ActionLink 去调用ajax 帮助类。Ajax.ActionLink 仅仅去重新加载那些发生变化的内容

讨论

MVC提供了几个给力的帮助类。到目前为止,这本书中已经广泛的应用了HTML Helper。在过去创建的所有view中,HTML helper至少都使用过一次。在这个秘方中,我们将使用AjaxHelper类替换掉Book/Index中的HtmlHelper 类。

实现Ajax需要一点额外的设置才可以使用。通常情况下我发现这个额外的工作,可以打消开发人员使用它的念头。我要让大家知道,额外的安装设置是值得的,因为带来的好处是获得了更好的用户体验,这是非常值得努力去做的。

步骤从web.config开始。2个关键的地方要被设置成true. ClientValidationEnabled 和UnobtrusiveJavaScriptEnabled。

译者:原书中代码引入了整个web.config文件。我们只需要到appSettings节点下即可找到这两个keys。

  <appSettings>
add key="webpages:Version" value="1.0.0.0" />
="ClientValidationEnabled"="true" ="UnobtrusiveJavaScriptEnabled"/>
</>

接下来的步骤是我们要引入几个javascript 文件。我们要在里shared 的layout文件夹里完成这件事,因为几乎我们创建所有的view时都会引用它(布局模板)。在Views/Shared/_Layout.cshtml 文件的<head>标签中。我们引入2个javascript 文件代码如下:

headtitle>@ViewBag.Titlelink href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
script src~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<~/Scripts/jquery.unobtrusive-ajax.min.js")"type>
这些文件自动的包含在基础MVC3应用程序中。(译者:你可以从scripts文件夹中找到他们)。以上的步骤完成AJAX的核心配置。接下来,我们要更新Book/index view。在下边的例子里,三个filter link和sortable header link将用Ajax.ActionLink 替换Html.ActionLink.代码如下:

@model PagedList.IPagedListMvcApplication.Models.Book>
@if (IsAjax)
{
Layout = null;
}
h2>
Title>
p>
@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
}
&nbsp; | &nbsp;
@if (ViewBag.CurrentFilter != "NewReleases")
{
@Ajax.ActionLink("New Releases",new
{
filter = "NewReleases",
sortOrder = ViewBag.CurrentSortOrder,
Keyword = ViewBag.CurrentKeyword
} new AjaxOptions { UpdateTargetId = "main" })
}
else
{
@:New Releases
}
&nbsp;
@if (ViewBag.CurrentFilter != "ComingSoon")
{
@Ajax.ActionLink("Coming Soon",new
{
filter = "ComingSoon",

new AjaxOptions { UpdateTargetId = "main" })
}
else
{
@:Coming Soon
}
>
@using (Html.BeginForm())
{
@:Search: @Html.TextBox("Keyword")input type="submit"="Search" />

}
@Html.Partial("_Paging")
tabletr>
th>
@Ajax.ActionLink("Title",new
{
sortOrder = ViewBag.TitleSortParam,
filter = ViewBag.CurrentFilter,0)">new AjaxOptions { UpdateTargetId = "main" })
Ajax.ActionLink("Isbn",new
{
sortOrder = ViewBag.IsbnSortParam,255)">>
Summary
Ajax.ActionLink("Author",new
{
sortOrder = ViewBag.AuthorSortParam,255)">>
Thumbnail
Ajax.ActionLink("Price",new
{
sortOrder = ViewBag.PriceSortParam,0)">Ajax.ActionLink("Published",new
{
sortOrder = ViewBag.PublishedSortParam,255)">>
@foreach (var item in Model)
{
>
td>
@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 link,AJAX请求的结果将会更新id 是“main”的html元素。如果你看看share文件夹中早期我们修改的layout文件,你会注意到有一个<div>的id 是“main”。实际上,这个div就是@Renderbody()的容器,它是一个view输出的地方。

另外一个重要的事就是我们在view的顶端加了一个AJAX是否完成的检测。如果请求通过AJAX完成,layout设置成null。这是一个非常重要的因素,因为如果它没完成,Ajax请求的结果将会包含不仅仅是view的result,也会包含整个layout,而没必要再去替换掉layout了。

为了完成这个示例,share文件夹下的_Paging也要使用Ajax helper更新,代码如下:

<p>
@if (Model.HasPrevIoUsPage)
{
@Ajax.ActionLink("<< First",Indexnew
{
page = 1,
filter = ViewBag.CurrentFilter
},
new AjaxOptions { UpdateTargetId =main" })
@Html.Raw(&nbsp;");
@Html.ActionLink(< Prevnew
{
page = Model.PageNumber - " })
}
else
{
@:<< First
@Html.Raw(");
@:< Prev
}
&nbsp;&nbsp;
@if (Model.HasNextPage)
{
@Ajax.ActionLink(Next >new
{
page = Model.PageNumber + ");
@Ajax.ActionLink(Last >>new
{
page = Model.PageCount,255)">else
{
@:Next >
@Html.Raw(")
@:Last >>
}
</p>

猜你在找的Ajax相关文章