仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1033|回复: 10
打印 上一主题 下一主题

[学习教程] ASP.NET编程:复杂洁净的C# MVC计划案例:BrothersDropdownList()仓酷云

[复制链接]
萌萌妈妈 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:17:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
什么叫数据库怎么样?什么意思?你想单学数据库。(其实变成是我问的)团队切换器

在/Teams/Details?id=xxx的页面,有如许一个控件,使得不必要回到/Teams/Index就可以轻松切换团队:

因为这类团队切换控件屈指可数,好比在团队故事板中(和其他中央多少处):

以是但愿开辟一个控件。
这个控件应当能:
1.里边所包括的链接主动跟从页面的链接。
好比第一张图里边,指向/Teams/Details?id=XXX;而第二张图里边,则是指向/Agile/TeamStoryBoards/Details?teamID=xxx
2.下拉菜单里边的一切链接,会由于id或teamID分歧而指向指定团队的页面。
计划思绪
挪用代码:



[html]



  • <divclass="link-spanspliter">
  • 切换团队:@Team.TeamsDropdownList(this,"id")
  • </div>

挪用代码老是很像天然言语,他说:在这个页面(this)的链接里有个字段("id")有差别,随Team而变更。在挪用代码中,任何比天然言语多的内容基础上都是渣滓内容。

实践上能够看出,Url自己不克不及硬编码写出来,而是应当从页面主动猎取;猎取后,把分歧链接中的id=xxx换成分歧Team的ID。

实践代码:



[csharp]



  • publicpartialclassTeam:Department
  • {
  • publicstaticHelperResultTeamsDropdownList(WebViewPagepage,stringurlKey)//urlKey就是"id"或"teamID"这两个,用来暗示必要交换URL中的哪一个参数的
  • {
  • varcurrentTeamID=page.ParameterOf(urlKey);//提取id或teamID的实践值,里边使用了page.Request.RawUrl,也能够用page.Request.Queries(我们之前不晓得有这个)。
  • varprogram=Program.Default();//获得缺省部门,部门是团队Team的上一个级别。
  • varcurrentTeam=string.IsNullOrEmpty(currentTeamID)?null:program.Teams().Single(i=>i.ID.ToString()==currentTeamID);//下拉菜单中确当前团队。
  • returnMFCUI.DropdownListHtml(page,
  • currentTeam==null?newMvcHtmlString("选择团队"):MFCUI.ImageLink(currentTeam.Title,page.Request.RawUrl,displayAsBoldTextOnPage:page),
  • program.Teams().Select(i=>MFCUI.ImageLink(i.Title,page.MergeParameter(urlKey,i.ID.ToString()),
  • displayAsText:currentTeam!=null&&i.ID==currentTeam.ID)));
  • }

MFCUI.DropdownListHtml是别的一个发生下拉菜单的控件,未几说了,关头是个中的一句话:




[csharp]



  • page.MergeParameter(urlKey,i.ID.ToString())

这句话把page.Request.RawUrl中的"id"或"teamID"交换为program.Teams()中分歧团队的ID,天生其新链接。
如许,这个办法就可以在任何页面,使用一个id/teamID等辨别字段名来主动发生团队切换的效果,而链接究竟指向那里不体贴。扩大
之前说的这个工具不错,但是在别的一种场景中不克不及间接用,好比上面这个“切换产物”:

挪用代码长得很像:



[html]



  • <divclass="link-spanspliter">
  • 切换产物:@Product.ProductsDropdownList(this,"id")
  • </div>


拷贝代码改写的了局是给Product增添一个相似函数:


[csharp]



  • publicstaticHelperResultProductsDropdownList(WebViewPagepage,stringurlKey)
  • {
  • varcurrentTeamID=page.ParameterOf(urlKey);
  • varproductLine=ProductLine.Default();
  • varcurrentProduct=string.IsNullOrEmpty(currentTeamID)?null:productLine.Products().Single(i=>i.ID.ToString()==currentTeamID);
  • returnMFCUI.DropdownListHtml(page,
  • currentProduct==null?newMvcHtmlString("选择团队"):MFCUI.ImageLink(currentProduct.Title,page.Request.RawUrl,displayAsBoldTextOnPage:page),
  • productLine.Products().Select(i=>MFCUI.ImageLink(i.Title,page.MergeParameter(urlKey,i.ID.ToString()),
  • displayAsText:currentProduct!=null&&i.ID==currentProduct.ID)));
  • }

这两个办法的内容几近完整不异,这是代码坏滋味的前兆;好比今后修正了MFCUI.DropdownListHtml,就要返来修正两个中央。

亏得Product和Team都承继自基类Item(用于处置树状布局,如Father,Brothers,SubItems之类的),如许就能够用基类举行改写:
不外,改写的时分最好遵守某些步骤,不然很简单在半路上撂挑子。
步骤1:改写个中一个函数,往失落详细的范例
我先拿Product里边谁人动刀,在本来函数的上面(不要间接给改了),增添一个新的函数:



[csharp]



  • publicstaticHelperResultBrothersDropdownList(WebViewPagepage,stringdefaultText,Itemfather,stringwhattype,stringurlKey)
  • {
  • varcurrentId=page.ParameterOf(urlKey);
  • varcurrentItem=string.IsNullOrEmpty(currentId)?null:father.SubItems().Single(i=>i.ID.ToString()==currentId);
  • returnMFCUI.DropdownListHtml(page,
  • currentItem==null
  • ?newMvcHtmlString(defaultText)
  • :MFCUI.ImageLink(currentItem.Title,page.Request.RawUrl,displayAsBoldTextOnPage:page),
  • father.SubItems().Where(i=>i.WhatType==whattype).Select(i=>MFCUI.ImageLink(i.Title,page.MergeParameter(urlKey,i.ID.ToString()),
  • displayAsText:currentItem!=null&&i.ID==currentItem.ID)));
  • }

一切分歧点,都被提取成一个参数:
defaultText用来处置“选择团队”和“选择产物”;father用来处置Program.Default()和ProductLine().Default();

whattype是我们用于在Item基类层面上辨别分歧的范例的,好比产物有产物线(ProductLine)-产物(Product)-版本-公布等层级;而团队有公司-子公司-部门(Program)-团队(Team)等层级。


[csharp]



  • father.SubItems().Where(i=>i.WhatType==whattype)

就是问father的下一级别中的whattype范例的。如许假如传进father=ProductLine.Default()和whattype=ItemWhatType.ProductProduct,就可以失掉一切产物,和本来代码了局不异。


如今,这个办法固然还在Products下,但里边已和Product完整有关了,这是步骤1的方针
在网页上测试一下:



[html]



  • <divclass="link-spanspliter">
  • 切换产物:@Product.ProductsDropdownList(this,"id")
  • 切换产物:@Product.BrothersDropdownList(this,"切换产物",ProductLine.Default(),ItemWhattype.ProductProduct,"id")
  • </div>

最好的测试办法,就是像下面如许做“对照测试”,然后看二者有何分歧;这个很像急迅开辟里边提到重构时,要考证产物的内部功效没有产生变更一样。
步骤2:挪到基类中
基类叫Item,函数名稳定仍是BrothersDropdownList,代码不写了。
从头做对照测试:



[html]



  • <divclass="link-spanspliter">
  • 切换产物:@Product.ProductsDropdownList(this,"id")
  • 切换产物:@Product.BrothersDropdownList(this,"切换产物",ProductLine.Default(),ItemWhattype.ProductProduct,"id")
  • 切换产物:@Item.BrothersDropdownList(this,"切换产物",ProductLine.Default(),ItemWhattype.ProductProduct,"id")
  • </div>


了局是三个控件功效完整不异,好了,删除前两个;再往Team何处把Team的办法删除,挪用也做响应修正。

今后任何Item派生类都能在桌面上扔如许一个控件来切换了。
在火星人里边一切工具都是Item,以是复用的次数十分多。
不可能天天有学习.net),我一同学说,你应该早就有作品啦。我惶惶然……
再见西城 该用户已被删除
沙发
发表于 2015-1-20 19:49:54 | 只看该作者
在asp.net虚拟主机的服务提供商中,目前首推的是CNNIC的其中一家域名注册机构---时代互联(www.ckuyun.com),他们早在2001年微软刚推出Asp.net时就推出了对应的Asp.net虚拟主机了,经笔者的使用测试,他提供的Asp.net性能非常的稳定,版本也会定期的更新,目前他的
admin 该用户已被删除
板凳
发表于 2015-1-29 18:21:16 | 只看该作者
通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。
因胸联盟 该用户已被删除
地板
发表于 2015-2-1 18:42:07 | 只看该作者
ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。
分手快乐 该用户已被删除
5#
发表于 2015-2-7 13:26:10 | 只看该作者
这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。
山那边是海 该用户已被删除
6#
发表于 2015-2-7 20:00:23 | 只看该作者
但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。
只想知道 该用户已被删除
7#
发表于 2015-2-11 01:34:51 | 只看该作者
ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。
飘飘悠悠 该用户已被删除
8#
发表于 2015-3-1 19:22:14 | 只看该作者
当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。
第二个灵魂 该用户已被删除
9#
发表于 2015-3-7 09:09:41 | 只看该作者
如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。
10#
发表于 2015-3-14 16:05:56 | 只看该作者
但是java靠开源打出的一片天地,特别是在微软的垄断下能打开今天的局面还是有它的生命力的。
小妖女 该用户已被删除
11#
发表于 2015-3-21 11:50:56 | 只看该作者
可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 12:23

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表