如何避免在MVC核心视图的条件代码中硬编码业务实体的值?

问题描述 投票:0回答:2

当我想根据数据库中的某些主表值显示特定的部分视图(或其他一些客户端代码)时,我的很多代码内部视图似乎都采用了以下形式 -

<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>

后端数据库包含一个Claim表和一个相关的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

如您所见,要完全显示的相应视图取决于ClaimStatusMaster表的SubmissionStatus字段的值。但是如果SubmissionStatus由于任何原因发生了变化,视图中的ifelse条件将会中断。此外,整个设置看起来像代码味道。因此,我试图找出如何更好地编码以最小化这种耦合,同时还能够有条件地显示基于SubmissionStatus值的适当视图。我怎样才能做到这一点?

PS:我可能会将ifelse代码放在控制器中,但它似乎会导致或多或少相同的问题。

asp.net-core-mvc ef-core-2.0
2个回答
1
投票

在大多数情况下,我会避免在视图中添加任何逻辑。但是,我认为像你这样的一些简单的逻辑选择基于控制器传递给它的某些属性的备用表示,是可以的。

话虽这么说,另一种方法是创建一个处理这种逻辑的扩展方法。您所做的只是调用扩展名,它将返回部分的全名。


0
投票

一种可能的方法是直接在逻辑中使用ClaimStatusId。您可以创建枚举:

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值同步。

© www.soinside.com 2019 - 2024. All rights reserved.