C#在哪里放置查看特定信息?

时间:2010-06-22 20:14:36

标签: c# asp.net presenter

我正在尝试减少整个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'等重叠属性而没有。我只是想知道人们通常如何应对这种情况。这是正确的命名约定吗?

1 个答案:

答案 0 :(得分: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,人们试图绕过这些限制。