Как сделать эти 2 блока практически идентичного кода многоразовыми? - PullRequest
4 голосов
/ 08 августа 2010

Мне нужен совет о том, что мне нужно сделать, чтобы следующие два блока кода можно было использовать повторно.Мне нужно создать другую таблицу фондов, и пока я делаю это, я хотел бы создать частичное представление FundsTable.ascx, которое могут использовать все представления, которые должны отображать таблицу фондов.

// Inherits="System.Web.Mvc.ViewPage<CompanyViewModel> // this is a company
<%foreach (var fund in Model.PageFunds){%>

    <% foreach (var shareClass in fund.ShareClasses) {%>

        <tr class="shareclass">
            <td>
                // displays an image if the ViewModel's Company is not unlisted
                <%= Html.TearsheetImage((Model.Company.ListingType != ListingType.UNLISTED))%>
            </td>
        </tr>
<% } }%>

и

// Inherits="System.Web.Mvc.ViewPage<GroupViewModel> // this is a group of companies
<%foreach (var fund in Model.PageFunds){%>

    <% foreach (var shareClass in fund.ShareClasses) {%>

        <tr class="shareclass">
            <td>
                // displays an image if any Company in the ViewModel's 
                // List<Company> is not unlisted
                <%= Html.TearsheetImage(
                        (Model.Companies.WithCompanyId(fund.Company.Id) != ListingType.UNLISTED))%>
            </td>
        </tr>
<% } }%>

Я думаю, что мне нужно где-то абстрагироваться от различий, но я не уверен, где это поставить.Есть ли эмпирическое правило, которому я должен следовать здесь?

Должны ли оба CompanyViewModel & GroupViewModel реализовать интерфейс, который решает, есть ли элемент в списке?Кроме того, какого типа должен быть мой FundTable.ascx?Я думал, что оба CompanyViewModel & GroupViewModel могут расширяться FundViewModel (или что-то в этом роде), и я мог бы сделать FundTable ViewUserControl<FundViewModel>, но я не думаю, что это сработает, потому что функциональность необходима для определения, отображать ли изображениедолжен прийти из CompanyViewModel & GroupViewModel независимо.

Плюс, чем больше я об этом думаю, тем больше я сам себя кланю!Есть идеи или предложения?Thankss

Ответы [ 2 ]

3 голосов
/ 08 августа 2010

Если я правильно читаю, код отличается только тем, как вы определяете, отображать ли изображение.

Если это правильно, это идеальное место для небольшого функционального программирования!

Создайте модель представления для вашего .ascx.мы назовем его FundsTable.

У него будет два свойства:

Func<PageFund,bool> ShowImage {get;set;}
IEnumerable PageFund Funds {get;set;}

Сделайте ваш FundsTable.ascx строго типизированным для этого объекта.

Теперь ваша логика о том,для отображения можно передать:

FundsTable ft = new FundsTable();
ft.ShowImage = f => f.SomeCombinationOfLogic == SomeOtherThing; //<-- Your function can be anything that returns a bool

Теперь вы можете сделать:

<% foreach (var shareClass in fund.ShareClasses) {%>

    <tr class="shareclass">
        <td>
            // displays an image if any Company in the ViewModel's 
            // List<Company> is not unlisted
           <% if(Model.ShowImage(fund)) {%>
               <%= Html.TearsheetImage(fund)%>
           <% } %>
        </td>
    </tr>

Теперь мне сложно сказать, как классы связаны друг с другом, чтобы вы моглинужно сместить типы и логику, но такой подход должен работать.Когда вы настраиваете модель представления для таблицы, просто передайте функцию, которая определит, показывать ли изображение.Добавьте другое свойство Func, если этот поиск в Tearsheet требует такой сложности.

0 голосов
/ 08 августа 2010

Для меня проблема, подобная этой, коренится в том факте, что модель представления компании и модель представления группы компаний по сути одно и то же (или должно быть), и вам каким-то образом, возможно, непреднамеренно удалось сделать из нее две разные модели представления , Общая логика заключается в том, что группа компаний должна быть просто List<CompanyViewModel>. Вы можете отправить список для просмотра или просмотра пользователя. Вам не нужно изобретать для этого новый класс viewmodel, просто чтобы включить коллекцию как свойство в этот класс.

посмотрите, что вы написали в закомментированных двух строках, и подумайте об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...