【发布时间】: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