您的位置:首页 > 其它

微型项目实践(11):控件与格式化显示

2008-05-27 11:02 369 查看
上一篇文章中,我们简单的分析了页面的设计,今天我们来看页面中的动态部分。Master和Default页面中的主要控件如下表:

控件ID描述
CalendarAsp.Net自带的日历控件,使用自带的样式,以后我们会使用该控件实现根据日期的查询。
ListView_BlogClassListView,用于显示日志分类。该控件生成的Html全部是连接,不需要响应事件,故EnableViewState设置为false。
ListView_BlogListListView,用于显示日志。该控件需要响应部分事件,所以其一部分子控件的EnableViewState设置为false,需要响应事件的部分设置为true。
LiteralPageCountLiteral,用于显示分页。这个控件结合我们自己的分页Helper使用。
在页面中,有很多需要格式化显示的地方,比如系统规定日期的显示规则为:如果时间中的时分秒都为零,则使用类似“2008年5月27日”的方式显示,否则,使用“2008年5月27日10:02:59”这样的方式显示;还有字符串的截断、布尔型类使用“是/否”显示、空字符串使用“ ”显示,以及各种枚举类型的显示等。对于这样的显示规则,我们使用Extension方法实现。如日期的显示使用以下代码(位于\DongBlog.UI\ToShowExtension.cs):

///<summary>
///显示日期
///</summary>
///<paramname="dateTime">要显示的日期</param>
///<returns>日期字符串</returns>
publicstaticStringToShow(thisDateTimedateTime)
{
if(dateTime.TimeOfDay==TimeSpan.Zero)
returnstring.Format("{0:yyyy年MM月dd日}",dateTime);
else
returnstring.Format("{0:yyyy年MM月dd日}{0:T}",dateTime);
}

在ListView_BlogList中,使用到了该方法,用于显示日志的更新时间:

<divrunat="server"enableviewstate="false"class="BlogUpdateDateTime">
<%#((DateTime)Eval("UpdateDateTime")).ToShow()%>
</div>

该方法把UpdateDateTime求值后,转化为DateTime类型,然后调用ToShow()方法。如果你觉得类型转换不优雅的话,还可以这样写:

<divrunat="server"enableviewstate="false"class="BlogUpdateDateTime">
<%#(Container.DataItemasBlog).UpdateDateTime.ToShow()%>
</div>

这种写法对于显示实体的关系数据非常方便,比如显示该日志对应的分类,我们使用这样的写法:

分类:<ahref="Default.aspx?BlogClassID=<%#(Container.DataItemasBlog).BlogClass.ID%>">
<%#(Container.DataItemasBlog).BlogClass.Name%></a>

这种方法利用了Linq对实体关系数据的LazyLoad,当读取Blog的BlogClass属性时,如果对应的BlogClass未被读取,则系统自动加载。

格式化显示的方法还能用于很多方面,例如,我们可以对PageBase类进行扩展,用于执行JavaScript:

///<summary>
///采用JavaScript的Alert()方法向客户端显示信息
///</summary>
///<paramname="page">页面</param>
///<paramname="message">要显示的信息</param>
publicstaticvoidJs_ShowMessage(thisPagepage,stringmessage)
{
if(page==null)
thrownewArgumentNullException("page");
page.Response.Write("<scriptlanguage=javascript>
alert(\""+message.Replace("\r\n","\\n")+"\")</script>");
page.Response.Flush();
}


还可以对表示“钱”的数字的输入输出抽象出来,假设系统规定页面中的“钱”都以万为单位,而数据库中以分为单位储存、业务层以分为单位运算,则我们只需要以下扩展类:

///<summary>
///金额的相关扩展
///</summary>
publicstaticclassMoneyExtension
{
///<summary>
///资金的单位
///</summary>
publicconstlongMONEY_UNIT=10000*100;
///<summary>
///资金的单位名称
///</summary>
publicconststringMONEY_UNIT_NAME="万元";
///<summary>
///将整数作为资金数额来显示,单位为:万。
///</summary>
///<paramname="money">要显示的数额</param>
///<paramname="withUnit">是否包含单位</param>
///<returns>要显示的字符串</returns>
publicstaticStringToShowAsMoney(thislongmoney,boolwithUnit)
{
if(withUnit)
return(((float)money)/MONEY_UNIT).ToString()+MONEY_UNIT_NAME;
else
return(((float)money)/MONEY_UNIT).ToString();
}
///<summary>
///将整数作为资金数额来显示,单位为:万。
///</summary>
///<paramname="money">要显示的数额</param>
///<paramname="withUnit">是否包含单位</param>
///<returns>要显示的字符串</returns>
publicstaticStringToShowAsMoney(thislong?money,boolwithUnit)
{
if(money.HasValue)
returnmoney.Value.ToShowAsMoney(withUnit);
else
return"无数据";
}
///<summary>
///将字符串转化为金额
///</summary>
///<paramname="money">表示金额的字符串</param>
///<returns>金额</returns>
publicstaticlong?ToMoney(thisstringmoney)
{
returnstring.IsNullOrEmpty(money)?null:
newint?(Convert.ToInt32(Convert.ToDecimal(money)*MONEY_UNIT));
}
}

则我们在页面中可以使用:

<%#(Container.DataItemasPayPlanItem).Amount.ToShowAsMoney(true)%>

将“1230000分”格式化“1.23万”,如果ToShowAsMoney的参数为false,则会格式化为“1.23”。

而在代码中可以可以用:

project.Amount=TextBoxAmount.Text.ToMoney();

将用于基于“万元”填入的数额转化为分为单位的。这种方法的最大好处在于便于修改,假设系统以后要以“千”或者“百”或者“元”为单位,只要修改MONEY_UNIT和MONEY_UNIT_NAME两个常量即可。

页面辅助方法的使用还有很多,凡是页面实现逻辑,几乎都可以用该方法进行抽象。(RubyOnRails的Helper方法也是这个思路)

回到我们的项目中来,现在,按下F5看一下效果了:





页面中ListView_BlogClass、ListView_BlogList和LiteralPageCount未绑定任何数据,所以没有显示出来。下一篇文章中,我们来看数据的绑定和显示。

代码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: