|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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),我一同学说,你应该早就有作品啦。我惶惶然…… |
|