我正在尝试减少整个asp.net Web表单中存在的代码重复.这是从数据库加载的示例对象的样子.
Apartment
int id
decimal rent
bool callForPricing
int squareFeet
int beds
int baths
现在,我在几个不同的asp.net页面中创建了这个对象的视图(即包含多个公寓,详细视图等的列表).在过去,我所做的是创建另一个包含Apartment类的类.像这样……
ApartmentView
Apartment apt
public virtual String Rent
{
get
{
if (apt.CallForPricing)
{
return "Call For Pricing";
}else{
return apt.Rent.ToString("C") + "/Month";
}
}
}
public virtual String BedsBathsSqFt
{
get
{
if (apt.squareFeet > 0)
{
return apt.beds + " Beds|" + apt.beds + " Beds|" + apt.SquareFeet + " sqft";
}else{
return apt.beds + " Beds|" + apt.beds + " Beds";
}
}
}
如您所见,我通常只是创建数据的字符串表示.我曾考虑让ApartmentView类扩展Apartment类,但由于’Rent’等重叠属性而没有.我只是想知道人们通常如何应对这种情况.这是正确的命名约定吗?
最佳答案 这对于任何webforms项目来说都是一个艰难的困境.条件格式化逻辑有两种选择 – 在页面本身(现在你必须在整个站点上复制它),或者在你正在做的某些代码中.在关注点分离方面,它们都不是很好的选择,这是ASP.Net webforms模型的一个众所周知的缺点.
就个人而言,我将您的视图转换为包含FormView控件的.ascx Web用户控件,并将其数据绑定到您的公寓包装器对象.就像是 :
<asp:FormView ID="FormView1"
DataSourceID="ObjectDataSource1"
RunAt="server">
<ItemTemplate>
<table>
<tr>
<td align="right"><b>Rent:</b></td>
<td><%# Eval("Rent") %></td>
</tr>
<tr>
<td align="right"><b>BedsBathsSqFt:</b></td>
<td><%# Eval("BedsBathsSqFt") %></td>
</tr>
</table>
</ItemTemplate>
</asp:FormView>
让.ascx公开DataSource属性,以便它可以由使用它的页面设置.
如果数据绑定对条件表达式更灵活,则可以取消公寓包装器对象并将条件直接嵌入用户控件中.虽然你的财产很复杂,但这可能会让你头疼不已.但是,您可以查看something like this,人们试图绕过这些限制.