Как избежать жесткого кодирования значений бизнес-сущностей в условном коде основных представлений MVC? - PullRequest
0 голосов
/ 21 апреля 2019

Большая часть моего кода внутри представлений, кажется, принимает приведенную ниже форму, когда я хочу показать конкретные частичные представления (или некоторый другой клиентский код) на основе некоторого значения основной таблицы в базе данных -

<div id="@claim.Id" class="ReimbursementClaims">
    @if (claim.ClaimStatus.SubmissionStatus == "Unsubmitted")
        {
            <partial name="~/Views/Claims/_ClaimDetailsEditor.cshtml" />
        }
    else (claim.ClaimStatus.SubmissionStatus == "Approved")
        {
            <partial name="~/Views/Claims/_ClaimDetailsReadonly.cshtml" />
        }
</div>

Внутренняя база данных содержит таблицу утверждений и связанную таблицу ClaimStatusMaster. Таблица ClaimStatusMaster - это основная таблица, означающая, что она существует только для хранения статических значений, таких как «Одобрено», «Не отправлено». Например -

create table Claim (Id int, ClaimStatusId int) --ClaimStatusId is a foreignkey linking to ClaimStatusMaster
create table ClaimStatusMaster (id int, SubmissionStatus varchar(20))
insert into ClaimStatusMaster values (2, 'Unsubmitted')
insert into ClaimStatusMaster values (1, 'Approved')
insert into ClaimStatusMaster values (3, 'Rejected') --etc

Как видите, соответствующий вид, который будет отображаться, полностью зависит от значения поля SubmissionStatus таблицы ClaimStatusMaster. Но если SubmissionStatus изменяется по какой-либо причине, условия ifelse в представлении нарушаются. Кроме того, вся эта настройка выглядит как запах кода. Итак, я пытаюсь выяснить, как лучше это кодировать, чтобы минимизировать такую ​​связь, а также иметь возможность условно отображать соответствующие представления на основе значений SubmissionStatus. Как мне этого добиться?

PS: Возможно, я могу поместить код ifelse в контроллер, но, похоже, это приводит к более или менее той же проблеме.

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

В большинстве случаев я бы избегал выставления какой-либо логики. Тем не менее, я думаю, что такая простая логика, как у вас, которая выбирает альтернативное представление на основе некоторого свойства, переданного ему контроллером, в порядке.

При этом альтернативой этому было бы создание метода расширения, который обрабатывает эту логику. Все, что вы делаете, это вызываете добавочный номер, и он возвращает полное имя частичного.

0 голосов
/ 22 апреля 2019

Одним из возможных способов является прямое использование ClaimStatusId в вашей логике. Вы можете создать Enum:

public enum SubmissionStatus
{
    Approved = 1 ,
    Unsubmitted =2 ,
    Rejected =3 ,
}

А затем напишите в логике:

<div id="@claim.Id" class="ReimbursementClaims">
@if ((int)claim.ClaimStatusId  == (int)SubmissionStatus.Unsubmitted)
{
    <partial name="~/Views/Claims/_ClaimDetailsEditor.cshtml" />
}

Но, конечно, вы должны синхронизировать значение перечисления с базой данных ClaimStatusMaster.

...