在我的项目中,我们允许用户注册不同的订阅费率,从而实现不同的功能。一些用户使用免费订阅,因此只有有限的功能,而付费用户可以使用他们的帐户执行额外的操作。此功能仍有待实施,但我正在创建一个关于关税细节的视图。
我有一个“SubscriptionTariffs”表和一个“SubscriptionServices”表,后者为每个服务保存前者ID字段的外键。在我看来,无论关税是否支持,我都希望显示所有可能的服务。如果他们可以获得该关税,我希望选中一个复选框,反之亦然。
因此,对于免费关税,我希望显示如下内容,其中前七个选项显示为勾选,其他选项未标记但仍显示:
<tr><td style="padding:5px;"><input type="checkbox" DISABLED checked /> @Language.ViewTransactions</td></tr>
<tr><td style="padding:5px;"><input type="checkbox" DISABLED checked /> @Language.CreateTransactions</td></tr>
<tr><td style="padding:5px;"><input type="checkbox" DISABLED checked /> @Language.Announcements</td></tr>
<tr><td style="padding:5px;"><input type="checkbox" DISABLED checked /> @Language.Alerts</td></tr>
<tr><td style="padding:5px;"><input type="checkbox" DISABLED checked /> @Language.Foldering</td></tr>
<tr><td style="padding:5px;"><input type="checkbox" DISABLED checked /> @Language.TransactionDownload</td></tr>
<tr><td style="padding:5px;"><input type="checkbox" DISABLED checked /> @Language.TransactionUpload</td></tr>
<tr><td style="padding:5px;"><input type="checkbox" DISABLED checked /> @Language.EZApproval</td></tr>
<tr><td style="padding:5px;"><input type="checkbox" DISABLED /> @Language.SupplyChainFinance</td></tr>
<tr><td style="padding:5px;"><input type="checkbox" DISABLED /> @Language.HierarchicalOrgs</td></tr>
<tr><td style="padding:5px;"><input type="checkbox" DISABLED /> @Language.WhiteLabeling</td></tr>
<tr><td style="padding:5px;"><input type="checkbox" DISABLED /> @Language.MultiFormatDownload</td></tr>
<tr><td style="padding:5px;"><input type="checkbox" DISABLED /> @Language.MultiFormatUpload</td></tr>
<tr><td style="padding:5px;"><input type="checkbox" DISABLED /> @Language.VANInteroperability</td></tr>
我写了以下内容来显示关税的所有相关服务:
@{
foreach (var SubscriptionService in this.Model.SubscriptionServices)
{
<tr><td style="padding:5px;"><input type="checkbox" DISABLED checked /> @(SubscriptionService.ServiceName != null ? SubscriptionService.ServiceName : "")</td></tr>
}
}
这很好用,但我需要显示所有服务,并根据需要选中或取消选中它们。
如果有人能指出我正确的方向,我会非常感激,我认为我应该能够写一个if-else语句或其他东西来检查,但我不完全确定。
答案 0 :(得分:1)
可能在此示例中this.Model.SubscriptionServices
是在所选资费下持有的服务,因此您只需添加未选中的复选框。
最容易做到这一点的地方就是你的模型,你应该为所有订阅服务添加另一个集合,然后在你的视图中你可以写:
@{
foreach (var SubscriptionService in this.Model.SubscriptionServices)
{
<tr><td style="padding:5px;"><input type="checkbox" DISABLED checked /> @(SubscriptionService.ServiceName != null ? SubscriptionService.ServiceName : "")</td></tr>
}
foreach (var SubscriptionService in this.Model.AllSubscriptionServices.Where( s => !this.Model.SubscriptionServices.Contains( s ) ) )
{
<tr><td style="padding:5px;"><input type="checkbox" DISABLED /> @(SubscriptionService.ServiceName != null ? SubscriptionService.ServiceName : "")</td></tr>
}
}
或者,在模型中应用此where子句会更有效,因为将更少的数据发送到View,如果您使用LINQ to SQL或其他ORM来访问您的数据模型(并通过),则效率更高那些模型直接到视图)然后你可以为生成的部分类添加一个布尔值:public bool IsInSelectedTarriff { get; set; }
然后写一个更复杂的查询来填充你的Model.SubscriptionServices集合:
this.SubscriptionServices = (
from sub in DataContext.SubscriptionServices
select new SubscriptionServices()
{
ID = ID,
ServiceName = ServiceName,
// copy all data directly into it's field
// ...
IsInSelectedTarriff = sub.SubscriptionTarriffID == this.SubscriptionTarriff
} );
您应该注意,如果在另一个视图中使用此模型,最佳做法是为特定于该屏幕的SubscriptionTarriff创建一个新的ViewModel,它是原始属性的直接副本,添加了{{1 }} 选项。 Tuple类也有助于将其他数据附加到集合中。