MVC部分视图在dropdownfor上抛出错误

时间:2015-07-01 16:48:04

标签: asp.net-mvc

我有一个部分视图我想显示为搜索界面。每当它告诉我我得到错误

  

没有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);
}

3 个答案:

答案 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]属性应用于该方法,以便用户在地址栏中输入网址时无法调用它。