萌萌妈妈 发表于 2015-1-18 11:17:53

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

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

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

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

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







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

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

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

实践代码:







[*]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是别的一个发生下拉菜单的控件,未几说了,关头是个中的一句话:








[*]page.MergeParameter(urlKey,i.ID.ToString())

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

挪用代码长得很像:







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


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






[*]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里边谁人动刀,在本来函数的上面(不要间接给改了),增添一个新的函数:







[*]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)等层级。






[*]father.SubItems().Where(i=>i.WhatType==whattype)

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


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







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

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







[*]<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一同送往客户端。

分手快乐 发表于 2015-2-7 13:26:10

这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。

山那边是海 发表于 2015-2-7 20:00:23

但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。

只想知道 发表于 2015-2-11 01:34:51

ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。

飘飘悠悠 发表于 2015-3-1 19:22:14

当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。

第二个灵魂 发表于 2015-3-7 09:09:41

如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。

仓酷云 发表于 2015-3-14 16:05:56

但是java靠开源打出的一片天地,特别是在微软的垄断下能打开今天的局面还是有它的生命力的。

小妖女 发表于 2015-3-21 11:50:56

可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
页: [1]
查看完整版本: ASP.NET编程:复杂洁净的C# MVC计划案例:BrothersDropdownList()仓酷云