【问题标题】:Multiple models in one view using IEnumerable使用 IEnumerable 在一个视图中显示多个模型
【发布时间】:2014-04-10 10:38:41
【问题描述】:

问题陈述: 我想创建一个视图,首先我接受两个参数作为起始日期和截止日期,以及一个基于哪个索引的下拉列表,以便显示与组合框中所选项目对应的所有详细信息。

为此,我定义了两个模型: 第一个模型包含要从前端插入的参数,在第二个模型中,我定义了在该页面的索引中显示所需的所有参数。

这是我的模型

public class SearchModel
    {
        [Required]
        [Display(Name = "From Date")]
        public DateTime FromDate { get; set; }

        [Required]
        [Display(Name = "To Date")]
        public DateTime ToDate { get; set; }

        [Display(Name = "Search #")]
        public String SearchNumber { get; set; }
    }

 public class IndexModel
    {
        [Required]
        [Display(Name = "Search #")]
        public string SearchNumber { get; set; }

        [Key]
        [Required]
        [Display(Name = "SearchID")]
        public int SearchID{ get; set; }

        [Display(Name = "Received Date")]
        public DateTime ReceivedDate { get; set; }
}

最后我将全局模型中的两个模型定义为:

public class GlobalModel
    {
        public SearchModel SearchModel { get; set; }
        public IndexModel IndexModel { get; set; }
    }

最后,当我尝试在索引视图中编写代码时,使用 GlobalModel 作为

@model IEnumerable<...SomePath.GlobalModel>  

@{
    ViewBag.Title = "Index";
}
<div style="padding-left: 40%">
        @using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))
        {
            @Html.AntiForgeryToken()
            @Html.ValidationSummary(true)

            <fieldset>
                <legend>Search</legend>
                  <ol>
                    <li>

                        <div class="editor-label">
                            @Html.LabelFor(model => model.SearchModel.FromDate)
                        </div>
                        <div class="editor-field">
                            @Html.EditorFor(model => model.SearchModel.FromDate)
                            @Html.ValidationMessageFor(model => model.SearchModel.FromDate)
                        </div>
                    </li>
                    <li>
                          <div class="editor-label">
                            @Html.LabelFor(model => model.SearchModel.ToDate)
                        </div>
                        <div class="editor-field">
                            @Html.EditorFor(model => model.SearchModel.ToDate)
                            @Html.ValidationMessageFor(model => model.SearchModel.ToDate)
                        </div>
                    </li>
                    <li>
                        @Html.DropDownListFor(model => model.SearchModel.SearchNumber, new SelectList(Model.ddlSearchNo.ddlSearchNumber, "Value", "Text"), "Select Search #", new { id="SearchID",onchange="GetSearchNo()" })
                        @Html.ValidationMessageFor(model => model.FirstOrDefault().SearchModel.SearchNumber)
                    </li>
                </ol>
               </fieldset>

        }
    </div>

<div>
    <table style="border-collapse: separate; border-spacing: 15px;">
    <tr>
        <th style="text-align:center;">
            @Html.DisplayNameFor(model => model.IndexModel.SearchNumber)
        </th>
        <th style="text-align:center;">
            @Html.DisplayNameFor(model => model.IndexModel.SearchID)
        </th>
        <th style="text-align:center;">
            @Html.DisplayNameFor(model => model.IndexModel.ReceivedDate)
        </th>

       </tr>

@foreach (var item in Model) {
    <tr>
        <td style="text-align:center;">
            @Html.DisplayFor(modelItem => item.IndexModel.SearchNumber)
        </td>
       <td style="text-align:center;">
            @Html.DisplayFor(modelItem => item.IndexModel.SearchID)
        </td>

        <td style="text-align:center;">
            @Html.DisplayFor(modelItem => item.IndexModel.ReceivedDate)
        </td>

        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.IndexModel.SearchID}) |
            @Html.ActionLink("Details", "Details", new{id=item.Model.SearchID}) |
            @Html.ActionLink("Delete", "Delete", new {id=item.IndexModel.SearchID })
        </td>
    </tr>
}

</table>

</div>

在这里,虽然我在顶部使用全局模型名称并使用全局模型的对象,但我正在尝试访问子模型的参数,但我遇到了错误 声明或无法识别。

如果我使用有人建议的 FirstorDefault(),我可以访问子模型的所有参数:

@Html.LabelFor(model => model.FirstorDefault().SearchModel.FromDate)

但在加载时会抛出异常,因为值不能为空。

再次,如果我不在顶部使用 Ienumerable,那么我在 foreach 循环中遇到错误。

我还在stackoverflow中发现,在将父模型中的子模型定义为时需要使用Ienumerable:

public IEnumerable<SearchModel> SearchModel { get; set; }
        public IEnumerable<IndexModel> IndexModel { get; set; }

但又出现了一些其他错误。

我只想加载我的视图,即使经过大量尝试和研究,我也无法加载。 我应该做些什么改变...?

任何帮助将不胜感激。

在控制器索引动作方法中,我写的代码如下:

 public ActionResult Index()
        {
            var result = GetDetails();
            return View(result); 
        }

我的方法是:

 public IEnumerable<GlobalModel> GetDetails()
        {
            return (from po in dbEntity.SearchDetails.AsEnumerable()
                      select new GlobalModel()
                    {
                      IndexModel = po

                       //SearchID = po.SearchID,
        //             //ReceivedDate = po.ReceivedDate,



                    }).ToList();

        }

在这里,我正在传递要加载的视图的全局模型,该模型由两个子模型组成。现在由于索引详细信息来自数据库,所以在这里我也无法初始化所有参数,因为我我试图将整个模型初始化为表的字段,这根本不可能。

另外,我在 po 获取数据库表的所有字段。但同样无法初始化,因为 IndexModel 引用了 Index Model 的整个参数。

所以,我卡在这里了。我需要解决这个问题。我在哪里做错了..?

【问题讨论】:

  • 你能添加你的操作方法吗,因为我怀疑你没有将你的模型传递到视图中。
  • 请你的控制器!
  • @rcadaoas ,我已经更新了我的问题并添加了控制器部分。你可以看看这个..
  • @Bellash ,我已经更新了我的问题并添加了控制器部分。你可以看看这个

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

正如我所见,您只想循环遍历 IndexModel,而 SearchModel 只有一个值。尝试采用这种方法:

将您的全局模型更改为:

public class GlobalModel
    {
        public SearchModel SearchModel { get; set; }
        public IEnumerable<IndexModel> IndexModels { get; set; }

    }

获取 IndexModels 的方法:

public IEnumerable<IndexModel> GetDetails()
        {
            return (from po in dbEntity.SearchDetails
                      select new IndexModel()
                    {
                      SearchNumber = po.SearchNumber,
                      SearchID = po.SearchID,
                      ReceivedDate = po.ReceivedDate 
                    }).ToList();

        }

在您的操作方法中:

public ActionResult Index()
        {
            var model = new GlobalModel():
            var model.IndexModels = GetDetails();
            return View(model); 
        }

终于在你的视野中:

@model ProjectName.Model.GlobalModel

@{
    ViewBag.Title = "Index";
}
<div style="padding-left: 40%">
        @using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))
        {
            @Html.AntiForgeryToken()
            @Html.ValidationSummary(true)

            <fieldset>
                <legend>Search</legend>
                  <ol>
                    <li>

                        <div class="editor-label">
                            @Html.LabelFor(model => model.SearchModel.FromDate)
                        </div>
                        <div class="editor-field">
                            @Html.EditorFor(model => model.SearchModel.FromDate)
                            @Html.ValidationMessageFor(model => model.SearchModel.FromDate)
                        </div>
                    </li>
                    <li>
                          <div class="editor-label">
                            @Html.LabelFor(model => model.SearchModel.ToDate)
                        </div>
                        <div class="editor-field">
                            @Html.EditorFor(model => model.SearchModel.ToDate)
                            @Html.ValidationMessageFor(model => model.SearchModel.ToDate)
                        </div>
                    </li>
                    <li>
                        @Html.DropDownListFor(model => model.SearchModel.SearchNumber, new SelectList(Model.ddlSearchNo.ddlSearchNumber, "Value", "Text"), "Select Search #", new { id="SearchID",onchange="GetSearchNo()" })
                        @Html.ValidationMessageFor(model => model.SearchModel.SearchNumber)
                    </li>
                </ol>
               </fieldset>

        }
    </div>

<div>
    <table style="border-collapse: separate; border-spacing: 15px;">
    <tr>
        <th style="text-align:center;">
            @Html.DisplayNameFor(model => model.IndexModels.SearchNumber)
        </th>
        <th style="text-align:center;">
            @Html.DisplayNameFor(model => model.IndexModels.SearchID)
        </th>
        <th style="text-align:center;">
            @Html.DisplayNameFor(model => model.IndexModels.ReceivedDate)
        </th>

       </tr>

@foreach (var item in Model.IndexModels) {
    <tr>
        <td style="text-align:center;">
            @Html.DisplayFor(modelItem => item.SearchNumber)
        </td>
       <td style="text-align:center;">
            @Html.DisplayFor(modelItem => item.SearchID)
        </td>

        <td style="text-align:center;">
            @Html.DisplayFor(modelItem => item.ReceivedDate)
        </td>

        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.SearchID}) |
            @Html.ActionLink("Details", "Details", new{id=item.SearchID}) |
            @Html.ActionLink("Delete", "Delete", new {id=item.SearchID })
        </td>
    </tr>
}

</table>

</div>

让我知道它是否有效。

【讨论】:

  • 首先我们可以使用 var 两次,所以它显示错误,我删除了一个然后它工作但再次在视图模型中。IndexModels.SearchNumber 无法访问,你能看看这个问题.
  • 如果您想在 forloop 之外访问 IndexModels,那么您需要像 @Model.IndexModels.FirstOrDefault().SearchNumber 那样进行操作,如果您需要获取特定的条件,您可以添加 where 条件searchnumber 像这样@Model.IndexModels.Where(x => x.SearchId == 1).FirstOrDefault().SearchNumber
  • 感谢 rcadaoas,确实是一个有用的解决方案。在您提供的代码中进行了修改,但它对我有很大帮助..真的谢谢..
【解决方案2】:

问题是因为您没有初始化 Search 模型和 Index 模型!

首先,您应该如下修改您的 GetDetails 方法

  public IEnumerable<GlobalModel> GetDetails()
    {
        var models=(from po in dbEntity.SearchDetails.AsEnumerable()
                  select new GlobalModel()
                {
                  IndexModel = new IndexModel(){
                     /* FromDate= po. FromDate,
                      ToDate= po. ToDate,*/
                      },
                  SearchModel = new SearchModel(){
                       /*SearchID = po.SearchID,
                       ReceivedDate = po.ReceivedDate,*/
                     },
                }).ToList();

    }

此外,您最好为IndexModel 类和SearchModel 类创建一个空构造函数。此构造函数将初始化类字段/属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    相关资源
    最近更新 更多