2010-06-22 79 views
4

我试图减少存在于我的asp.net web窗体中的代码重复。这是从数据库加载的示例对象的样子。C#在哪里放置查看特定信息?

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'这样的重叠属性。我只是想知道人们通常如何处理这种情况。这是使用正确的命名约定吗?

回答

2

这是在任何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,人们试图解决这些限制。