使用从模型传递的信息填充复选框

时间:2013-01-31 11:31:33

标签: c# jquery asp.net asp.net-mvc-3

在我的项目中,我们允许用户注册不同的订阅费率,从而实现不同的功能。一些用户使用免费订阅,因此只有有限的功能,而付费用户可以使用他们的帐户执行额外的操作。此功能仍有待实施,但我正在创建一个关于关税细节的视图。

我有一个“SubscriptionTariffs”表和一个“SubscriptionServices”表,后者为每个服务保存前者ID字段的外键。在我看来,无论关税是否支持,我都希望显示所有可能的服务。如果他们可以获得该关税,我希望选中一个复选框,反之亦然。

因此,对于免费关税,我希望显示如下内容,其中前七个选项显示为勾选,其他选项未标记但仍显示:

            <tr><td style="padding:5px;"><input type="checkbox" DISABLED checked />&nbsp; @Language.ViewTransactions</td></tr>
            <tr><td style="padding:5px;"><input type="checkbox" DISABLED checked />&nbsp; @Language.CreateTransactions</td></tr>
            <tr><td style="padding:5px;"><input type="checkbox" DISABLED checked />&nbsp; @Language.Announcements</td></tr>
            <tr><td style="padding:5px;"><input type="checkbox" DISABLED checked />&nbsp; @Language.Alerts</td></tr>
            <tr><td style="padding:5px;"><input type="checkbox" DISABLED checked />&nbsp; @Language.Foldering</td></tr>
            <tr><td style="padding:5px;"><input type="checkbox" DISABLED checked />&nbsp; @Language.TransactionDownload</td></tr>
            <tr><td style="padding:5px;"><input type="checkbox" DISABLED checked />&nbsp; @Language.TransactionUpload</td></tr>
            <tr><td style="padding:5px;"><input type="checkbox" DISABLED checked />&nbsp; @Language.EZApproval</td></tr>
            <tr><td style="padding:5px;"><input type="checkbox" DISABLED />&nbsp; @Language.SupplyChainFinance</td></tr>
            <tr><td style="padding:5px;"><input type="checkbox" DISABLED />&nbsp; @Language.HierarchicalOrgs</td></tr>
            <tr><td style="padding:5px;"><input type="checkbox" DISABLED />&nbsp; @Language.WhiteLabeling</td></tr>
            <tr><td style="padding:5px;"><input type="checkbox" DISABLED />&nbsp; @Language.MultiFormatDownload</td></tr>
            <tr><td style="padding:5px;"><input type="checkbox" DISABLED />&nbsp; @Language.MultiFormatUpload</td></tr>
            <tr><td style="padding:5px;"><input type="checkbox" DISABLED />&nbsp; @Language.VANInteroperability</td></tr>

我写了以下内容来显示关税的所有相关服务:

        @{
            foreach (var SubscriptionService in this.Model.SubscriptionServices)
            {
                <tr><td style="padding:5px;"><input type="checkbox" DISABLED checked />&nbsp; @(SubscriptionService.ServiceName != null ? SubscriptionService.ServiceName : "")</td></tr>
            }
        }

这很好用,但我需要显示所有服务,并根据需要选中或取消选中它们。

如果有人能指出我正确的方向,我会非常感激,我认为我应该能够写一个if-else语句或其他东西来检查,但我不完全确定。

1 个答案:

答案 0 :(得分:1)

可能在此示例中this.Model.SubscriptionServices是在所选资费下持有的服务,因此您只需添加未选中的复选框。

最容易做到这一点的地方就是你的模型,你应该为所有订阅服务添加另一个集合,然后在你的视图中你可以写:

@{
    foreach (var SubscriptionService in this.Model.SubscriptionServices)
    {
        <tr><td style="padding:5px;"><input type="checkbox" DISABLED checked />&nbsp; @(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 />&nbsp; @(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类也有助于将其他数据附加到集合中。