2015-07-01 32 views
1

我有一个局部视图我想显示为搜索界面。每次它告诉我我得到的错误MVC部分查看投递错误的下拉菜单

没有ViewData项的IEnumerable类型具有密钥resource_type_id。

我已经尝试过这么多的事情,使这项工作,但没有什么帮助。

这是我的看法调用partialview

@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()) 
    { 
    } 
} 

这是我partialview

@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> 
} 

这是一个似乎永远不会得到所谓的控制器......

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

这是ViewModel

namespace NewSAMACentral2._0.ViewModel 
{ 
    public class MemberResourcesViewModel 
    { 
     public IEnumerable<MemberResource> MemberResourceResult; 
     public MemberResource memberResource; 

     public class MemberResource 
     { 
      public ResourceSearch resource_search { get; set; } 
      [Key] 
      public int Id { get; set; } 
      [DisplayName("Resource Title")] 
      public string title { get; set; } 
      public IEnumerable<SelectListItem> resource_type { get; set; } 
      [DisplayName("Resource Type")] 
      public string resource_type_id { get; set; } 
      [DisplayName("Keyword")] 
      public string keyword { get; set; } 
      [DisplayName("Author")] 
      public string author { get; set; } 
      [DisplayName("Subject Type")] 
      public string subject_type { get; set; } 
      [DisplayName("Industry")] 
      public string industry { get; set; } 
      [DisplayName("Description")] 
      public string description { get; set; } 
     } 

     public class ResourceSearch 
     { 
      [DisplayName("Author")] 
      public string author { get; set; } 
      public IEnumerable<SelectListItem> resource_type { get; set; } 
      [DisplayName("Resource Type")] 
      public string resource_type_id { get; set; } 
      [DisplayName("Keyword")] 
      public string keyword { get; set; } 
     } 
    } 
} 
+0

将其从'DropDownListFor(model => Model.resource_type_id)'改为'DropDownListFor(m => m.resource_type_id)'。并将相同的更改应用于其他HTML助手。 – Dai

回答

0

在你的主视图动作(不是局部的视图操作的结果):

var types = db.Resource_Types.Distinct().OrderBy(x => x.Text).ToList(); 
SelectList typeList = new SelectList(types, "ID", "Name"); 
ViewBag.Types = typelist; 

的一切事,有一个从数据库中提取的对象。然后,我们将其转换为一个选择列表,其中'ID'作为值字段,'Name'作为文本字段。然后我们把这个选择列表放在一个viewbag中供我们的视图使用。

接下来在你的部分观点:

@Html.DropDownListFor(model => model.resource_type_id, new SelectList(ViewBag.Types, "value", "text"), "-- Select --", new { @class = "form-control" }) 

在这个HTML的唯一区别是选择列表的拉动值,所以你永远不必担心它甚至击中局部视图控制器。我还将模型中的大写“M”更改为小写,因为不需要

请记住将ViewBag的代码放在主动作结果中,而不是部分视图动作结果。

斯蒂芬评论下面你真正需要的是:

@Html.DropDownListFor(model => model.resource_type_id, (SelectList)ViewBag.Types, "-Select-", ...) 
+0

它只是需要'@ Html.DropDownListFor(model => model.resource_type_id,(SelectList)ViewBag.Types,“-Select-”,...)''ViewBag.Types'属性已经是'SelectList' 。它的无意义(和不必要的额外开销)再次从它创建一个新的'SelectList'。 –

+0

如果用户想要一个默认的选定值将按我的方式,但你是对的,它可以工作 – code

+0

如果你想要一个'默认值'你的值分配给控制器中的属性。你的代码是毫无意义的,只是从现有的'SelectList'中创建一个重复的'SelectList' –

0

你必须要小心用大写字母,并把模型中未型号:发生

@Html.LabelFor(model => model.resource_type_id) 
@Html.DropDownListFor(model => model.resource_type_id, model.resource_type, "-- Select --", new { @class = "form-control" }) 
0

你的错误,因为Model.resource_type值在DropDownListFor()方法中使用时为空。

在您的主视图中,您使用Html.Partial()来渲染名为SearchResource.cshtml的局部视图,并将其传递给您的类ResourceSearch的新实例。但ResourceSearch没有默认构造函数,它初始化resource_type属性,因此它的null,因此是例外。

您的命名约定和嵌套模型的使用使其难以理解,并且您未显示主视图的GET方法,但我怀疑您希望实际调用控制器上的SearchResource()方法,该方法将返回表格的局部视图。在这种情况下,您需要使用

@{Html.RenderAction("SearchResource")} 

它将调用该方法并返回其部分。由于该方法初始化的ResourceSearch一个新的实例,并其resource_type财产,这将不再是null

注意,你也应该考虑应用[ChildActionOnly]属性的方法,因此不能输入的URL中的用户被称为地址栏。