4

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」などのプロパティが重複しているため、そうしませんでした。私は、人々が通常この状況にどのように対処するのか疑問に思っています。これは正しい命名規則ですか?

4

1 に答える 1

2

これは、Webフォームプロジェクトで取り組むのが難しいジレンマです。条件付き書式設定ロジックには2つの選択肢があります。ページ自体(サイト全体に複製する必要があります)、または実行しているように背後にあるコードです。どちらも関心の分離という点で優れたオプションではありません。これは、ASP.NetWebフォームモデルのよく知られた欠点です。

個人的には、ビューを.ascx Webユーザーコントロールに変換します。このコントロールには、FormViewコントロールが含まれており、アパートのラッパーオブジェクトにデータバインドされます。何かのようなもの :

<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プロパティを公開させて、それを使用しているページで設定できるようにします。

データバインディングが条件式でより柔軟である場合は、アパートメントラッパーオブジェクトを廃止し、条件をユーザーコントロールに直接埋め込むことができます。ただし、プロパティが複雑なため、これはおそらく大きな頭痛の種になります。しかし、あなたはこのようなものを見ることができます、そこで人々はそれらの制限を回避しようとしました。

于 2010-06-22T21:21:10.340 に答える