2010-06-22 3 views
4

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

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

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