推荐:一道让我惦记了一年的机试题
总体需求:
在某系统中,有一个模块,功能需求是:从数据源中读取一组数据,用户可以根据模版选择不同的展示界面.
程序设计人员将这个模块为两部来做.
1.先从数据库中读取一组数据,转换成XML数据,做为数据源提供给展示层.
2.以XML做为数据源,提供至少两种展现界面,并且用户可以从提供的多种界面中选择一个.
A:列表展现
姓名 |
出生日期 |
性别 |
学历 |
李世民 |
1950年1月1日 |
男 |
研究生 |
秦始皇 |
1960年1月1日 |
男 |
专科 |
孔明 |
1970年1月1日 |
男 |
博士 |
小白 |
1990年1月1日 |
男 |
初中 |
慈禧 |
1940年1月1日 |
女 |
本科 |
B摘要展现形式
李世民 男1950年1月1日
职业皇帝,名声不错。做的最悔的事是兄弟相残,所以天天做恶梦。但也做了不少好事。开创贞观之治。是唐代最盛之时期。
秦始皇 男 1960年1月1日
职业皇帝。原名赢政。统一六国成为他最大功绩。是中国历史上第一皇帝,称始皇帝。
…………………….
C 标签形式展现形式
秦始皇 |
小白 |
性别:男 生日:1960年1月1日 学历:专科 简介:职业皇帝。原名赢政。统一六国成为他最大功绩。是中国历史上第一皇帝,称始皇帝 |
(模版要使用单独的模版文件,后期需要添加模版文件,以添加展现的形式。)
进度:
1.取得数据并转换成XML数据的工作,已经完成(见data.xml).
2.为xml数据源开发两个展示的界面.(一.列表形式的展现形式,二提供摘要形式的展现形式.)
题目:
1.用文字描述可以实现的方案,描述时需要涉及期关键的技术点。(至少提供2种解决方案,每个方案5分)共10分.
(注:如果15分钟之内不能提供解决方案。可以寻求提示,我们会给你三种设计方案。但此步骤无分)
2.可以根据其中的一个方案,进行详细设计.(共40分)
流程图(15分)
方法(函数)规划(25分)
方法1.中文名称
输入参数
输出参数
功能描述
方法2.中文名称
输入参数
输出参数
功能描述
方法3.中文名称
输入参数
输出参数
功能描述
.............
展示的实现思路:
从需求中的三种展现形式中,选择其中两种,描述技术实现思路,应用到的技术。
(注:这部分可以不做,但记0分)
3.根据设计开发程序.(50分)
只写出一个模版得10分
写出模版转换的关键代码得10分。
第二个写出了“列表模版”或“摘要展现形式”得20分,
第二个写出了“标签展现”得20
三个全写出得30分。
我用两种方法实现了:
方法1.利用Repeater控件动态加载显示模板文件
Repeater1.ItemTemplate = Page.LoadTemplate(path + "/ItemTemplate.ascx");
这个方法最省事,不用写什么转换方法,加载模板文件就成了。不过俺感觉很不爽的地方是:
Repeater1.HeaderTemplate = Page.LoadTemplate(path + "/HeaderTemplate.ascx");
Repeater1.ItemTemplate = Page.LoadTemplate(path + "/ItemTemplate.ascx");
Repeater1.FooterTemplate = Page.LoadTemplate(path + "/FooterTemplate.ascx");
俺本来想定义一个模板文件把HeaderTemplate 、ItemTemplate、FooterTemplate都包含进去,Repeater只加载 这个文件就可以了,由Repeater自己去分析哪个是HeaderTemplate还是ItemTemplate,可是俺折腾了半天没找到办法,只好用上边的代码凑合了,哪位兄弟有好的办法别忘了给俺指点一下。其实这个地方还可以还个方式实现,就是载模板文件中定义Repeater及它的样式,这样就避免了上边的不爽,我另一个实现方式里边是用的这个思路。
方法2:
根据不同的显示样式建立其模板控件,这些模板控件按照设定的标准编写,并继承自一个转换类,该类负责分析转换模板中的标识符;最后由PlaceHolder加载模板控件,这个办法写的代码多点,不过适用范围广,不限于记录列表的显示,像dnn那样,按照标准编写页面的显示样式文件,可以很容易的实现换肤等,也可以实现类似咱们博客园的风格模板。这个地方也可以不用ascx,编写html模板文件也可以,然后对html文件中的元素进行分析替换,以说本质上是一样的。
主要代码(conver.cs转换部分):
{
protected System.Web.UI.HtmlControls.HtmlGenericControl list; //模板文件中的用来标记行记录的div
protected void Page_Load(object sender, EventArgs e)
{
//xmldocList:导入行记录的模板-》从数据源中取得记录后加入其中-》作为html代码传回模板文件
XmlDocument xmldocList = new XmlDocument();
try
{
xmldocList.LoadXml(list.InnerHtml); //导入需要处理部分的html代码,需要符合xml格式
}
catch
{
list.InnerHtml = "导入的模板文件格式不符合标准!";
}
XmlNodeList nodeTemplate = xmldocList.GetElementsByTagName("repeat");//记录模板
DataService ds = new DataService();
XmlDocument xmldoc = ds.getData(); //获得数据
XmlNodeList nodelist = xmldoc.GetElementsByTagName("item"); //数据源中的记录行
StringBuilder sb = new StringBuilder();
int i = 0 ;
foreach (XmlNode node in nodelist)//数据源中的一个记录节点 =》xmldocList中的一个节点
{
if (node.HasChildNodes)
{
foreach (XmlNode nodeItem in nodeTemplate) //记录模板的每一列
{
XmlNode nodetr = nodeItem.FirstChild.CloneNode(true);
foreach (XmlNode nodeCol in node.ChildNodes)//根据记录模板中的标记字符进行内容替换
{
nodetr.InnerXml = nodetr.InnerXml.Replace("[" + nodeCol.Name + "]", nodeCol.InnerText);
nodetr.InnerXml = nodetr.InnerXml.Replace("[ID]",i.ToString());
}
nodeItem.AppendChild(nodetr);
}
}
i++;
}
foreach (XmlNode nodeItem in nodeTemplate)
{
nodeItem.RemoveChild(nodeItem.FirstChild); //不再需要记录模板,把记录模板节点去掉
}
//把xmldocList.InnerXml中的标记子符去掉,作为html代码赋给页面
list.InnerHtml = System.Text.RegularExpressions.Regex.Replace(xmldocList.InnerXml, "<repeat>|</repeat>|<template>|</template>","");
}
}
当时不明白那个技术总监出题的意图,现在明白了,他其实想考察俺有没有把页面表现和业务逻辑分层以及代码复用的意识。
这里是我的答案,载ie7下测试试过,在firefox下测试时发现不支持window.onload方法,算了,不管了
代码 :/Files/mapk/my2008.rar