我有一个部分视图我想显示为搜索界面。每当它告诉我我得到错误
没有IEnumerable类型的ViewData项具有关键字resource_type_id。
我已经尝试了很多东西来完成这项工作,但没有任何帮助。
这是我的视图调用partialview
$(function(){
$('select').selectmenu();
});
这是我的部分视图
@model IEnumerable<NewSAMACentral2._0.ViewModel.MemberResourcesViewModel.MemberResource>
@{
ViewBag.Title = "Add Resource To Folder";
}
<h2>Add Resource To Folder</h2>
<div>
@{Html.Partial("SearchResource", new NewSAMACentral2._0.ViewModel.MemberResourcesViewModel.ResourceSearch());}
</div>
@using (Ajax.BeginForm("InsertAttendee", "Meetings", new AjaxOptions { HttpMethod = "POST" }))
{
if (Model.Any())
{
}
}
这是一个似乎永远不会被召唤的控制器...
@model NewSAMACentral2._0.ViewModel.MemberResourcesViewModel.ResourceSearch
@using (Ajax.BeginForm("AddAttendee", "Meetings", new AjaxOptions { UpdateTargetId = "AddAttendee", HttpMethod = "POST" }))
{
<div class="form-group">
<label for="keyword">Keyword(s): </label>@Html.TextBox("keyword", null, new { @class = "form-control" })
</div>
<div class="form-group">
@Html.LabelFor(model => Model.resource_type_id)
@Html.DropDownListFor(model => Model.resource_type_id, Model.resource_type, "-- Select --", new { @class = "form-control" })
</div>
<div class="form-group">
<label for="author">Author(s): </label>@Html.TextBox("author", null, new { @class = "form-control" })
</div>
<div class="form-group">
<input type="submit" name="submit" value="Search" />
</div>
}
这是ViewModel
public PartialViewResult SearchResource()
{
var results = new MemberResourcesViewModel.ResourceSearch();
results.resource_type = db.Resource_Types.Select(s => new SelectListItem
{
Text = s.name,
Value = s.id.ToString()
}).Distinct().OrderBy(x => x.Text);
return PartialView(results);
}
答案 0 :(得分:0)
在您的主视图操作(不是部分视图操作结果)上:
var types = db.Resource_Types.Distinct().OrderBy(x => x.Text).ToList();
SelectList typeList = new SelectList(types, "ID", "Name");
ViewBag.Types = typelist;
在那里完成的所有操作都是从DataBase中提取对象。然后我们将其转换为带有&#39; ID&#39;的选择列表。作为值字段和&#39;名称&#39;作为文本字段。然后我们将选择列表放在视图包中供我们的视图使用。
下一步在您的局部视图中:
@Html.DropDownListFor(model => model.resource_type_id, new SelectList(ViewBag.Types, "value", "text"), "-- Select --", new { @class = "form-control" })
此HTML的唯一区别在于它从选择列表中提取值,因此即使点击局部视图控制器也不必担心它。我也改变了首都&#39; M&#39;在模型中为小写,因为不需要
请记住在主操作结果中放置ViewBag的代码,而不是部分视图操作结果。
正如斯蒂芬在下面评论的那样,你真正需要的是:
@Html.DropDownListFor(model => model.resource_type_id, (SelectList)ViewBag.Types, "-Select-", ...)
答案 1 :(得分:0)
您必须小心使用大写字母并将模型放入模型:
@Html.LabelFor(model => model.resource_type_id)
@Html.DropDownListFor(model => model.resource_type_id, model.resource_type, "-- Select --", new { @class = "form-control" })
答案 2 :(得分:0)
发生错误是因为在Model.resource_type
方法中使用DropDownListFor()
的值为空。
在主视图中,您使用Html.Partial()
呈现名为SearchResource.cshtml
的部分视图,并向其传递类ResourceSearch
的新实例。但是ResourceSearch
没有默认构造函数,它初始化resource_type
属性,使其null
,因此异常。
您的命名约定和嵌套模型的使用使其难以理解,并且您没有为主视图显示GET方法,但我怀疑您想要在控制器上实际调用SearchResource()
方法将返回表单的局部视图。在这种情况下,您需要使用
@{Html.RenderAction("SearchResource")}
将调用该方法并返回其部分。由于该方法初始化ResourceSearch
的新实例并填充其resource_type
属性,因此它将不再是null
请注意,您还应该考虑将[ChildActionOnly]
属性应用于该方法,以便用户在地址栏中输入网址时无法调用它。