C # Где поставить просмотр конкретной информации? - PullRequest
4 голосов
/ 23 июня 2010

Я пытаюсь уменьшить дублирование кода, которое присутствует в моих веб-формах asp.net. Вот как выглядит пример объекта, загруженного из базы данных.

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, но не сделал этого из-за перекрывающихся свойств, таких как «Аренда». Мне просто интересно, как люди обычно справляются с этой ситуацией. Это правильное соглашение об именах для использования?

1 Ответ

2 голосов
/ 23 июня 2010

Это сложная дилемма для проработки любого проекта веб-форм.У вас есть два варианта логики условного форматирования - на самой странице (теперь вы должны продублировать ее по всему сайту) или в некотором коде, как вы делаете.Также не существует хороших вариантов с точки зрения разделения интересов, это известный недостаток модели веб-форм ASP.Net.

Лично я бы превратил ваше представление в пользовательский веб-элемент управления .ascx, содержащий элемент управления 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, чтобы его можно было установить на странице, которая его использует.

Если бы привязка данных была более гибкой с условными выражениями, вы могли бы сделатьпрочь с оберткой квартиры объекта и встраивать условия непосредственно в пользовательский контроль.Хотя со сложностью ваших свойств, это, вероятно, будет большой головной болью.Однако вы можете посмотреть на что-то вроде этого , где люди пытались обойти эти ограничения.

...