ASP.NET MVC中的部分视图非常好。它们允许您仅更新DOM的一部分,而不必执行完整的页面刷新或回发。当然,有很多方法可以实现这一点,比如ajaxwebAPI,但是部分视图比其他方法有一个主要的好处:

强类型的数据模型

使用这种方法,控制器可以将一个漂亮的对象模型推回到部分视图而不是Json,我们可以利用Razor和/或脚手架进行数据呈现,同时增强整个用户体验。

在这个例子中,我们将创建一个包含一个下拉框的母版页,然后我们将添加一个部分视图来显示由下拉列表值过滤的数据。

父/主视图

部分视图需要位于主页/父页面中,因此我们创建一个:

@model Models.FullAndPartialviewmodel
@{
    ViewBag.Title = "My Master Page";
}

<script type="text/javascript" src="CDN or local jquery file"></script>

<div id="container">  
    <label for="ddlCategory"><strong>Select a category</strong></label>
    @Html.DropDownListFor(m =>m.CategoryId,new SelectList(Model.CategoryList,"CategoryId","CategoryName",Model.CategoryId),new { id = "ddlCategory",@class = "test" })
    <br/><br/>
    <div id="dvCategoryResults">
        @{Html.RenderPartial("CategoryResults",Model);}
    </div>
</div>

这里没什么好想的有一些HTML元素丢失(头,身体等),但我认为这些已经被定义。但是,您需要注意两件事情:

  1. 你需要参考jquery。这可以是本地的或通过CDN<script type="text/javascript" src="CDN or local jquery file"></script>
  2. 并且,您需要将部分视图放在div中,因为我们将在ajax调用中稍后引用div

部分视图

部分视图只是普通视图的非常纤薄的版本。您只需添加必需的html元素。通常,您应该避免在部分视图中放置任何javascript和css引用,并尽量使其尽可能轻。视图的名称应@Html.RenderPartial()与主视图中声明中使用的名称相同CategoryResults

@model Models.FullAndPartialviewmodel
<table>  
    <thead>
        <tr>
            <th>Category</th>
            <th>Product</th>
            <th>Price</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var product in Model.Products)
        {
            <tr>
                <td>@product.Category</td>
                <td>@product.Product</td>
                <td>@product.Product</td>
            </tr>
        }   
    </tbody>
</table>

3.控制器

控制器由3种方法组成:

  • 一个用于加载整个页面(父和部分) -Index()
  • 一个用于重新加载/刷新部分视图 -GetCategoryProducts()
  • 和一个帮助程序来创建和填充数据模型 -GetFullAndPartialviewmodel()
[HttpGet]
public async Task<ActionResult> Index()  
{
   var model = await this.GetFullAndPartialviewmodel();
   return this.View(model);
}

[HttpGet]
public async Task<ActionResult> GetCategoryProducts(string categoryId)  
{
    var lookupId = int.Parse(categoryId);
    var model = await this.GetFullAndPartialviewmodel(lookupId);
    return PartialView("CategoryResults",model);
}

private async Task<FullAndPartialviewmodel> GetFullAndPartialviewmodel(int categoryId = 0)  
{
    ... code omitted...
    // populate the viewmodel and return it
    return fullAndPartialviewmodel;
}

4.数据模型

public class FullAndPartialviewmodel  
{
    public int CategoryId { get; set; }
    public List<CategoryProductItem> Products { get; set; }
    public List<CategoryListItem> CategoryList { get; set; }
}

AJAX代码

这里的想法是在用户从下拉列表中选择不同的类别时,重新加载页面上的部分视图。在您的母版页底部,在html下面添加以下JavaScript代码:

<script type="text/javascript">  
    $(document).ready(function () {
        $("#ddlCategory").change(function () {
            var categoryId =  $("#ddlCategory").val();
               $("#dvCategoryResults").load('@(Url.Action("GetCategoryProducts","Home",null,Request.Url.Scheme))?categoryId=' + categoryId);
        });     
    });
</script>

注意:JavaScript代码可以并且应该存在于外部.js文件中,但是为了简单起见,我将其放在一起。

编辑作为读者指出(感谢marc),如果您将代码放在外部.js文件中,请确保删除任何Razor代码,因为它会破坏事物。在上面的例子中,@UrlAction ..应该被替换为正确的链接。

这一小块代码是从下拉列表中拉取categoryId的值,执行GetCategoryProducts()Home控制器中方法的调用,然后使用新数据更新包含部分视图的div的内容。

使用部分视图,很容易扩展您的视图,并使其更加灵敏和用户友好。更重要的是,jQuery使它成为一个蛋糕,只用几行代码来交互和更新部分视图!

快乐编码...

使用Ajax更新MVC部分视图的更多相关文章

  1. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  2. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. html5简介_动力节点Java学院整理

    这篇文章主要介绍了html5简介,用于指定构建网页的元素,这些元素中的大多数都用于描述网页内容,有兴趣的可以了解一下

  5. ios 8 Homescreen webapp,关闭和打开iPad停止javascript

    我有一个适用于iPad的全屏HTML5网络应用程序,并且刚刚安装了IOS8来试用它,它一切正常,直到你关闭并重新启动iPad.一旦web应用程序重新启动javascript就会停止并加载新页面不会重新启动它.在iPad上的Safari中打开同一页面时,关闭和打开iPad会继续按预期工作.其他人注意到了这个或想出了一个解决方案吗?解决方法这似乎是我在iOS8.1.1更新中解决的.

  6. iOS 6 javascript与object.defineProperty的间歇性问题

    当访问使用较新的Object.defineProperty语法定义属性的对象的属性时,有没有其他人注意到新iOS6javascript引擎中的间歇性错误/问题?https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty我正在看到javascript失败的情况,说

  7. ios – 如何使用JSExport导出内部类的方法

    解决方法似乎没有办法将内部类函数导出到javascript.我将内部类移出并创建了独立的类,它起作用了.

  8. 静音iOS推送通知与React Native应用程序在后台

    我有一个ReactNative应用程序,我试图获得一个发送到JavaScript处理程序的静默iOS推送通知.我看到的行为是AppDelegate中的didReceiveRemoteNotification函数被调用,但是我的JavaScript中的处理程序不会被调用,除非应用程序在前台,或者最近才被关闭.我很困惑的事情显然是应用程序正在被唤醒,并且它的didReceiveRemoteNotifi

  9. ios – 内存泄漏与UIWebView和Javascript

    清楚地包含一个Javascript文件到我的HTML是使UIWebView泄漏内存.当我重复使用相同的UIWebView对象时,或者每当我有内容实例化一个新的漏洞时,会出现泄漏的事实,导致我认为必须有一些JavaScript文件被loadHTMLString处理,导致泄漏.有人知道如何解决这个问题吗?

  10. iOS应用程序的UI自动化测试如何与乐器和Javascript

    从WWDC2010视频会议中了解iOS应用程序的自动化UI测试,但没有实践.从代码项目project,我们可以有一个例子.这个问题在这里听到有涉及这个的人.任何限制?解决方法我建议从AlexWollmer开始使用thisblogpost.他创建了一个非常有用的JavaScript库:tuneup_jswithtest()函数,它允许测试分离和有用的帮助者以及为自动化仪器编写测试的断言.

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部