没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2010-03-26 11:54:17.000|阅读 1053 次
概述:本文将为大家介绍已经发布的ASP.NET MVC 2框架正式版的使用情况,包括缓存,静态内容的放置等等。希望本文能对大家有所帮助。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
本文将为大家介绍已经发布的ASP.NET MVC 2框架正式版的使用情况,包括缓存,静态内容的放置等等。希望本文能对大家有所帮助。
这个月一直在用 ASP.NET MVC 2 做http://www.86e0.com/t 这个网站,用的时候是 aps.net MVC2 RC2,然后现在ASP.NET MVC 2正式版已经是发布了。 在MVC的使用上,有一些心得。下面作一下总结,希望对大家有用,也欢迎大家讨论。
1.关于缓存
缓存上,数据层上的缓存是必须的,这点不必多说了。
另一个很重要的是:视图片段缓存。
我参考了老赵的写的三篇关于片段缓存的文章:
适合ASP.NET MVC的视图片断缓存方式(上):起步
适合ASP.NET MVC的视图片断缓存方式(中):更实用的API
适合ASP.NET MVC的视图片断缓存方式(下):页面输出原则
本想用老赵的了,但是我发现ASP.NET MVC 2 的有一个新功能: Html.Partial可以返回生成的HTML, 返回的类型是:MvcHtmlString. 虽然要利用Partial View才能生成Html片段,但是我想这个已经够我用的了, 所以我做了一个这样一个Helper,主要是将生成的HTML片段缓存到Memcached里。代码如下:
public static class MvcHtmlHelper { public static MvcHtmlString MemcacheHtmlPartial(this HtmlHelper htmlHelper,int duration, string partialViewName, object model, ViewDataDictionary viewData) { object obaear = htmlHelper.ViewContext.RouteData.DataTokens["area"]; string area=string.Empty; if (obaear != null) area = obaear.ToString(); string key = string.Format("MemcacheHtmlPartial_{0}{1}", area, partialViewName); object ob = DistCache.Get(key); if (ob == null) { MvcHtmlString mstr = htmlHelper.Partial(partialViewName, model, viewData); DistCache.Add(key, mstr.ToString(), TimeSpan.FromSeconds(duration)); return mstr; } else { return MvcHtmlString.Create((string)ob); } } } |
然后,我觉得,这样,在每次请求时,还是要在Controller 里把数据取出来,然后再传到 Partial View里。 既然已经缓存了,就应该不用每次请求都要在Controller里把数据取出来才对!虽然数据层会有缓存。
所以我,能不能再省下去Controller取数据的消耗,于是又有了以下代码,其功能是:缓存Action生成的HTML到 Memcached里。
说明一下,Actionhelper的方法是在MVC原代码里提取出来的。 因为MVC2里的 Html.RenderAction方法并没有返回 MvcHtmlString的重载版。那位有更好的方法?
其实,MVC里的Action有输出缓存,所以直接在View里用 Html.RenderAction都可以解决很多问题了。这个主要是可以用程序管理缓存。
2.关于静态内容的放置
习惯上,静态内容会放在 mvc程序所在的目录下,比如说js,css,上传的图片等。但是这样的话,所有的静态请求都要经过 aspnet_isapi 处理,这样是非常不合算的。所以静态内容一般都会放在另外的子域上。http://www.86e0.com/t 是放在 cdn.86e0.com上。
3.关于强类型ViewModel
我基本上看了老赵的Asp.net MVC最佳实践。 其中有一点,就是强烈推荐使用强类型的ViewModel. 我试了一些页面,发现用强类型的ViewModel,现阶段并不适用于我。因为我是用NbearLite,从数据库抓出来的大多是DataTable. 我是觉得DataTable+NbearLite蛮方便的,虽然没有动态语言的数据访问来得方便,但是比用Entity,ViewModel, DTO,等等来说,还是可以省下很多代码。然后,最重要的是,由于我这种站经常会修改,所以数据库改变,加字段,减字段是很经常性的事。但是,用 NbearLite + DataSet,DataTable,却非常方便。
所以我觉得,做Asp.net MVC,如果你不是用DDD,DDT的话,用DataTable还是可以的。因为DDD,DDT学习起来还是要点成本的。
4.关于URL生成
URL生成, 老赵写了一系列文章:
各种URL生成方式的性能对比
各种URL生成方式的性能对比(结论及分析)
为URL生成设计流畅接口(Fluent Interface)
URL生成方式性能优化结果
Raw方式了, 速度是最快的,比较适合适合,而不是强类型的才是适合。
最后,分享一个很实用的Asp.net MVC 分页Helper.
这个Helper引自重典老大的blog:http://www.cnblogs.com/chsword/ . 我在之前做了少少修改,现已经在http://www.86e0.com/t 上使用了。
效果如下:
请大家注意生成的 URL, 是用 ?参数=页码 的方式。代码如下:
ASP.NET MVC延伸阅读
ASP.NET MVC是微软官方提供的MVC模式编写ASP.NET Web应用程序的一个框架。
它由Castle的MonoRail而来.目前已经历经数个版本。ASP.NET MVC中的MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
ASP.NET MVC框架是既ASP.NET WebForms后的又一种开发方式。它提供了一系列优秀特性,使ASP.NET开发人员拥有了另一个选择。ASP.NET MVC框架选项非常干净,而且容易使用。它将允许你在应用中轻易地保持关注分离,且有助于进行干净的测试和TDD。
/// <summary> /// 分页Pager显示 /// </summary> /// <param name="html"></param> /// <param name="currentPageStr">标识当前页码的QueryStringKey< /param> /// <param name="pageSize">每页显示</param& gt; /// <param name="totalCount">总数据量</param> /// <returns></returns> public static string Pager(this HtmlHelper html, string currentPageStr, int pageSize, int totalCount) { var queryString = html.ViewContext.HttpContext.Request.QueryString; int currentPage = 1; //当前页 if(!int.TryParse(queryString[currentPageStr], out currentPage)) currentPage = 1; // 与相应的QueryString绑定 var totalPages = Math.Max((totalCount + pageSize - 1) / pageSize, 1); // 总页数 var dict = new RouteValueDictionary(html.ViewContext.RouteData.Values); var output = new StringBuilder(); foreach (string key in queryString.Keys) if (queryString[key] != null && !string.IsNullOrEmpty(key)) dict[key] = queryString[key]; if (totalPages > 1) { if (currentPage != 1) {//处理首页连接 dict[currentPageStr] = 1; output.AppendFormat("<span class=\"p_home\">{0}</span& gt;", html.RouteLink("首页", dict)); } if (currentPage > 1) {//处理上一页的连接 dict[currentPageStr] = currentPage - 1; output.AppendFormat("<span class=\"p_up \">{0}</span>", html.RouteLink("上一页", dict)); } else { output.AppendFormat("<span class=\"p_disable\"& gt;{0}</span>","上一页"); } int currint = 5; for (int i = 0; i <= 10; i++) {//一共最多显示10个页码,前面5个,后面5个 if ((currentPage + i - currint) >= 1 && (currentPage + i - currint) <= totalPages) if (currint == i) {//当前页处理 output.Append(string.Format("<span class=\"p_current\">{0}</span>", currentPage)); } else {//一般页处理 dict[currentPageStr] = currentPage + i - currint; output.AppendFormat("<span class=\"p_num\">{0}</span>",html.RouteLink((currentPage + i - currint).ToString(), dict)); } } if (currentPage < totalPages) {// 处理下一页的链接 dict[currentPageStr] = currentPage + 1; output.AppendFormat("<span class=\"p_down \">{0}</span>", html.RouteLink("下一页", dict)); } else { output.AppendFormat("<span class=\"p_disable \">{0}</span>", "下一页"); } if (currentPage != totalPages) { dict[currentPageStr] = totalPages; output.AppendFormat("<span class=\"p_last \">{0}</span>",html.RouteLink("末页", dict)); } } output.AppendFormat("<span class=\"p_count\">第{0}页/共{1}页& lt;/span>", currentPage, totalPages);//这个统计加不加都行 return output.ToString(); } |
public static class MvcHtmlHelper { public static MvcHtmlString MemcacheHtmlPartial(this HtmlHelper htmlHelper,int duration, string partialViewName, object model, ViewDataDictionary viewData) { object obaear = htmlHelper.ViewContext.RouteData.DataTokens["area"]; string area=string.Empty; if (obaear != null) area = obaear.ToString(); string key = string.Format("MemcacheHtmlPartial_{0}{1}", area, partialViewName); object ob = DistCache.Get(key); if (ob == null) { MvcHtmlString mstr = htmlHelper.Partial(partialViewName, model, viewData); DistCache.Add(key, mstr.ToString(), TimeSpan.FromSeconds(duration)); return mstr; } else { return MvcHtmlString.Create((string)ob); } } } |
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:网络转载面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号