【问题标题】:more than one ViewModel on same page in MVCMVC 中同一页面上的多个 ViewModel
【发布时间】:2024-05-23 13:25:01
【问题描述】:

我确实有一个表单,其中我有三个部分视图和一个网格,因此对于所有这 4 个视图模型,正在使用 4 个不同的视图模型。现在根据我的理解,将有一个包含所有 4 个视图模型和其中一个是 IEnumarable 将被 Grid 使用。

我的代码如下:

    @model IEnumerable<Invoice.Models.ViewModels.Setup.AccountViewModel>

    @{
        ViewBag.Title = "Account";
        Layout = "~/Views/Shared/_LayoutGrid.cshtml";
    }



        @(Html.Kendo().Grid(Model)
            .Name("Account")
            .Columns(columns =>
            {

                columns.Bound(p => p.AccountType).Title("Account Type").Width(250);

                columns.Bound(p => p.AccountName).Title("Account Name").Width(300);

                columns.Bound(p => p.Currency).Title("Currency").Width(120);

                columns.Bound(p => p.Status).ClientTemplate("#=data.Status#").Width(150);

            })
            .ToolBar(toolbar =>
             {
                 toolbar.Template(@<text>
                    <div class="row-fluid">
                        <div class="span1">
                            <div class="toolbar" style="height:25px;">
                                <ul id="menu" style="width:38px; margin-left:22px;" class="span6">
                                    <li style="width:36px;">
                                        <i class="fa fa-plus"></i>
                                        <ul>
                                            @foreach (var account in @ViewBag.AccountType)
                                            {
                                                <li style="width:100px;" class="openid">
                                                    @if(@account.Value=="Bank")
                                                    {
                                                    <label id="Bank1">@account.Value</label>
                                                    }
                                                    @if(@account.Value=="CreditCard")
                                                    {
                                                    <label id="Credit">@account.Value</label>
                                                    }
                                                    @if(@account.Value=="Cash")
                                                    {
                                                    <label id="Cash1">@account.Value</label>
                                                    }
                                                </li>

                                            }
                                        </ul>
                                    </li>
                                </ul>
                            </div>
                        </div>
                    </div>
                </text>);
             })


            <div id="Bank">
            @Html.Partial("_BankDetails")
        </div>

        <div id="Cash">
            @Html.Partial("_CashDetails")
        </div>

        <div id="Credit">
            @Html.Partial("_CreditCardDetails")
    </div>

正如您所见,我正在使用仅用于显示网格的 AccountViewModel,但还有 3 个 ViewModel 用于提交这些部分视图。

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 kendo-ui


    【解决方案1】:

    您可以创建一个结合了您需要的 4 个视图模型的视图模型:

    public class FullAcountModel
    {
        public IEnumerable<AccountViewModel> Accounts { get; set; }
    
        public CashDetails CashDetails { get; set; }
    
        public BankDetails BankDetails { get; set; }
    
        public CreditCardDetails CreditCardDetails { get; set; }
    }
    

    使用此模型,您可以像这样创建网格:

    @(Html.Kendo().Grid(Model.Accounts)
    

    还有这样的部分:

    @Html.Partial("_BankDetails", Model.BankDetails)
    

    【讨论】:

    • 传入字典的模型项的类型是'System.Collections.Generic.List`1[Invoice.Models.ViewModels.Setup.AccountViewModel]',但是这个字典需要一个类型的模型项'Invoice.Models.ViewModels.Setup.OverAllViewModel'。
    • 仍然收到此错误,我已在视图顶部包含以下模型 @model Invoice.Models.ViewModels.Setup.OverAllViewModel
    • 尝试使用关键字Virtual,无论您在哪里使用IEnumerable。我已经编辑了上面的帖子。检查并让我们知道您是否仍然遇到该错误。
    • @user2477114 看起来您正在将IEnumerable&lt;AccountViewModel&gt; 传递给视图,而它必须是OverAllViewModel。我认为您应该在调用 return View(model) 或其他内容的控制器中更改此设置
    • 仍然无法正常工作,但我使用了 HTML 标签的部分视图的松散类型视图