ASP.NET MVC之Unobtrusive Ajax(五)

前言

这一节我们来讲讲Unobtrusive中的Ajax提交,大部分情况下我们是利用JQuery来进行Ajax请求,当然利用JQuery来进行表单Ajax请求也不例外,但是相对于Unobtrusive Ajax来进行表单请求则Unobtrusive Ajax代码量显得更加精简,所以基于这点本文来讲讲这个Unobtrusive Ajax。

话题

我们首先一步一步深入来讲述我们本节的话题,我们在Models文件夹下建立如下一个类:

    public class Blog
    {
        public long Id { get; set; }

        public string Name { get; set; }

        public string BlogAddress { get; set; }

        public string Description { get; set; }

        public Category Category;

    }

    public enum Category
    {
        C,
        Java,
        JavaScript,
        SQLServer
    }

接下来我们建立一个Blog控制器并且初始化数据,如下:

                private Blog[] blogs = {
                new Blog { Id =1, Name ="xpy0928 1",Category=Category.C,BlogAddress="http://www.cnblogs.com/CreateMyself/", Description ="出生非贫即贵,你我无能为力"},
                new Blog { Id =2, Name ="xpy0928 2", Category=Category.Java,BlogAddress="http://www.cnblogs.com/CreateMyself/",Description ="后天若不加以努力赶之超之,又能怪谁呢!"},
                new Blog { Id =3, Name ="xpy0928 3",Category=Category.JavaScript,BlogAddress="http://www.cnblogs.com/CreateMyself/", Description ="自己都靠不住不靠谱,又能靠谁呢!" },
                new Blog { Id =4, Name ="xpy0928 4",Category=Category.SQLServer, BlogAddress="http://www.cnblogs.com/CreateMyself/",Description ="靠自己!"}
                               };

我们现在的场景是显示博客中所有数据,然后通过下拉框中的类别来筛选对应的数据。我们来看看:

显示博客所有数据 GetBlogs 

        public ActionResult GetBlogs()
        {
            return View(blogs);
        }

根据类别筛选数据:

        [HttpPost]
        public ActionResult GetBlogs(string selectedCategory)
        {
            if (selectedCategory == null || selectedCategory == "All")
            {
                return View(blogs);
            }
            else
            {
                Category selected = (Category)Enum.Parse(typeof(Category), selectedCategory);
                return View(blogs.Where(p => p.Category == selected));
            }
        }

在视图中,我们给出如下代码:

(1)获取所有博客数据:

@model IEnumerable<Blog>
<h2>GetBlogs</h2>
<table style="background-color:lightcoral">
    <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>BlogAddress</th>
            <th>Description</th>
            <th>Category</th>
        </tr>
    </thead>
    <tbody>
        @foreach (Blog p in Model)
        {
            <tr>
                <td>@p.Id</td>
                <td>@p.Name</td>
                <td>@p.BlogAddress</td>
                <td>@p.Description</td>
                <td>@p.Category</td>
            </tr>
        }
    </tbody>
</table>

(2)生成下拉分类列表:

@using (Html.BeginForm())
{
    <div>
        @Html.DropDownList("selectedCategory", new SelectList(new[] { "All"}.Concat(Enum.GetNames(typeof(Category))) ))
        <button type="submit">提交</button>
    </div> 

}

我们运行程序结果如下:

一切都如正常的进行,但是这样做页面会重新加载页面。

那么问题来了,如果我们想根据下拉列表不重新加载页面又该如何呢?我们就利用本节要讲的Unobtrusive Ajax!

Unobtrusive Ajax

我们需要在Web.Config进行如下启动:

接下来我们通过NuGet下载Unobtrusive Ajax,如下:

然后在视图中引入如下脚本:

<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>

接下来我们对控制器方法进行相应的调整,结合我们之前学到的分部视图:

        public PartialViewResult GetBlogData(string selectedCategory = "All")
        {
            IEnumerable<Blog> data = blogs;
            if (selectedCategory != "All")
            {
                Category selected = (Category)Enum.Parse(typeof(Category), selectedCategory);
                data = blogs.Where(p => p.Category == selected);
            }
            return PartialView(data);
        }

        public ActionResult GetBlogs(string selectedCategory = "All")
        {
            return View((object)selectedCategory);
        }

此时我们重点在视图中利用Unobtrusive Ajax。

    AjaxOptions ajaxOptions = new AjaxOptions
    {
        UpdateTargetId = "blogsTable",
    };
    <tbody id="blogsTable">
        @Html.Action("GetBlogData", new { selectedCategory = Model })
    </tbody>

利用AjaxOptions中的UpdateTargetId对应我们需要筛选的数据。接下来我们利用Ajax请求

@using (Ajax.BeginForm("GetBlogData", ajaxOptions))
{
    <div>
        @Html.DropDownList("selectedCategory", new SelectList(
            new[] { "All" }.Concat(Enum.GetNames(typeof(Category)))))
        <button type="submit">提交</button>
    </div>
}

接下来我们看看运行结果:

接下来我们来看看AjaxOptions其他参数 :

    AjaxOptions ajaxOptions = new AjaxOptions
    {
        UpdateTargetId = "blogsTable",
        LoadingElementId = "loadingBlogs",
        LoadingElementDuration = 1000,
        Confirm = "你真的要显示所有博客?",
    };
<div id="loadingBlogs" style="background-color:cadetblue; display:none">
    <p>Loading Blogs...</p>
</div>

上述 LoadingElementId  为加载数据时显示加载中, LoadingElementDuration  为显示加载中时间。我们看看其显示效果,通过将时间延长。

显示加载中:

如上我们是通过下拉框点击提交按钮进行获取数据。

那么问题来了,我们如何通过链接来获取数据呢?请往下看。

我们在视图中添加如下:

<div>
    @foreach (string category in Enum.GetNames(typeof(Category)))
    {
        <div class="ajaxLink">
            @Ajax.ActionLink(category, "GetBlogData",
                new { selectedCategory = category },
                new AjaxOptions { UpdateTargetId = "blogsTable" })
        </div>
    }
</div>

我们运行看看效果:

我们点击C试试效果,如下:

结语 

本节我们利用Unobtrusive Ajax来实现类似JQuery的Ajax提交,利用Unobtrusive Ajax也是一种还不错的方式,而且Unobtrusive Ajax中AjaxOptions还有其他参数有兴趣的童鞋可以去了解了解。本节利用这个去请求分部视图并填充,但是这种方式还不是最优的方案,我们完全可以利用JSON来返回数据,对吧,下节我们利用JsonResult来返回数据。晚安,世界。【说明:有关MVC系列代码已全部托管于Github,可以点击右上角(Fork me on Github)下载代码】。

 

时间: 2024-09-21 22:04:50

ASP.NET MVC之Unobtrusive Ajax(五)的相关文章

ASP.NET MVC中的AJAX应用_实用技巧

一.ASP.NET MVC中的AJAX应用 首先,在ASP.NET MVC中使用自带的ajax功能,必须要导入2个js文件(顺序不能颠倒): ASP.NET MVC提供了2个常用的ajax辅助方法. Ajax.ActionLink 该辅助方法用于在页面上生成具有ajax功能的超链接. 在该辅助方法中有一个AjaxOptions类型的参数,它包括如下属性: Confirm:在发送ajax请求前,弹出确认对话框,该属性就是设置对话框中的提示消息HttpMethod:用于设置请求的类型:Get|Pos

ASP.NET MVC案例教程(基于ASP.NET MVC beta)—第五篇:MVC整合Ajax

摘要 本文将从完成"输入数据验证"这个功能出发,逐渐展开ASP.NET MVC与Ajax结合的方法.首先,本文将使用ASP.NET MVC提供的同步方式完 成数据验证.而后,将分别结合ASP.NET AJAX和JQuery将这个功能重构成异步形式. 数据验证 在上一篇文章中,我们完成了发布公告的功能.但是从健壮性角度看,这个功能并不完善,因为一般情况下,我们输入的数据要符合一定的 约束条件,例如,在我们的例子中,我们至少不能将空字符串作为标题或内容吧.下面,我们来为程序加入数据验证功能

为ASP.NET MVC框架添加AJAX支持

一.引言 本文中,我们将向你展示如何在基于ASP.NET MVC框架构建 的ASP.NET应用程序中添加一些基本的Ajax特征(例如局部更新及行为组件等概念 ). [说明]本文向你提供了有关于ASP.NET MVC框架的完整应用源码及 测试示例.在本文方案中,共有两个工程:一个是TaskList(Web应用程序), 另一个是AjaxMVC(一个提供了扩展的Ajax支持的类库).请注意,类库AjaxMVC 中提供的函数实现了一些基本的Ajax功能,例如不依赖于页面回寄的局部更新以 及关联到DOM元

asp.net mvc 如何通过ajax给htmlhelper的dropdownlist重新赋值

问题描述 asp.netmvc如何通过ajax给htmlhelper的dropdownlist重新赋值 解决方案 解决方案二:在对应的控制器中写上,下面代码是使用LINQTOSQL来从Northwind数据库中提取种类,publicActionResultIndex(){vardb=newNorthwindDataContext();IEnumerable<SelectListItem>items=db.Categories.Select(c=>newSelectListItem{Val

ASP.NET MVC之AJAX

本文的例子基于Asp.Net MVC Preview 3,并采用了jQuery完成客户端的JavaScript功能. 之前的两篇文章粗粗的对Asp.Net MVC做了介绍.这里强烈推荐一个网站,有兴趣的朋友可以看这里.这是Rob Conery的个人网站,他采用了Asp.Net MVC做了一个Demo, 不仅在codeplex上提供了这个项目的源代码,还提供了15个视频,这些视频的内容包括从项目的构思.到设计.再到实现和重构的一个完整的过程. ASP.NET Web Form下的AJAX 在传统的

ASP.NET MVC使用Ajax的辅助的解决方法_实用技巧

前言:前面我们已经简单的介绍过了MVC如何Jquery,因为我们如果使用Ajax的话必须要了解Jquery,这篇博客我们将大致了解一下ASP.NET MVC如何使用Ajax的辅助方法,此博客是我的读书笔记,如果那里写的不好,还请各位朋友提出来,我们共同学习.1.准备工作 (1)在MVC刚开始学习的时候,我们就需要介绍ASP.NET MVC框架中的HTML的辅助方法,但是这类文章现在已经很多了,而且个人感觉很简单,所以没有写笔记,我在这里就不介绍了. (2)ASP.NET MVC框架中的HTML辅

返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test

原文:返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test[索引页][源码下载] 返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test 作者:webabcd 介绍 asp.net mvc 之 Action Filter, UpdateModel, ModelBinder, Ajax, U

ASP.NET MVC 3 Beta新特性以及.Net开源的趋势----最新译文

NuPack – .NET的开源软件包管理器 NuPack是一个开源的软件包管理器,它使你在项目中能够更加容易的查找.安装和使用.NET 库.它能够和所有的.NET 项目类型很好的一起工作(包括,没有任何限制的,ASP.NET Web Forms和ASP.NET MVC). NuPack 使维护开源项目的开发者(例如, Moq, NHibernate, Ninject, StructureMap, NUnit, Windsor, RhinoMocks, Elmah, 等等) 能够去打包他们的库,

一起谈.NET技术,ASP.NET MVC 3 Beta新特性以及.Net开源的趋势----最新译文

NuPack – .NET的开源软件包管理器 NuPack是一个开源的软件包管理器,它使你在项目中能够更加容易的查找.安装和使用.NET 库.它能够和所有的.NET 项目类型很好的一起工作(包括,没有任何限制的,ASP.NET Web Forms和ASP.NET MVC). NuPack 使维护开源项目的开发者(例如, Moq, NHibernate, Ninject, StructureMap, NUnit, Windsor, RhinoMocks, Elmah, 等等) 能够去打包他们的库,