Asp.net mvc 没有类型为';IEnumerable<;选择列表项>';那有钥匙';类别

Asp.net mvc 没有类型为';IEnumerable<;选择列表项>';那有钥匙';类别,asp.net-mvc,Asp.net Mvc,我在这个问题上发现了很多类似的线索。但无论我做什么,它都不适合我 我现在唯一想做的就是在部分视图中用数据库值填充一个下拉列表,它位于部分视图中。就这些,这简直让我发疯。用户应该能够在下拉列表中选择类别名称 这是我的控制器类: public class AttributeController : Controller { private readonly IRepository<ClassLibrary.Entities.Attribute> _aRepository;

我在这个问题上发现了很多类似的线索。但无论我做什么,它都不适合我

我现在唯一想做的就是在部分视图中用数据库值填充一个下拉列表,它位于部分视图中。就这些,这简直让我发疯。用户应该能够在下拉列表中选择类别名称

这是我的控制器类:

public class AttributeController : Controller
{
    private readonly IRepository<ClassLibrary.Entities.Attribute> _aRepository;
    private readonly IRepository<Category> _cRepository;

    public AttributeController() : this(new Repository<ClassLibrary.Entities.Attribute>(), new Repository<Category>())
    { 
    }

    public AttributeController(IRepository<ClassLibrary.Entities.Attribute> repo, IRepository<Category> repository)
    {
        _aRepository = repo;
        _cRepository = repository;
    }

    //
    // GET: /Attribute/
    public ActionResult Index()
    {
        var attributes = _aRepository.GetAll();
        var attributeViewModels = new List<AttributeViewModel>();

        foreach (ClassLibrary.Entities.Attribute attribute in attributes)
        {
            var viewModel = new AttributeViewModel();
            viewModel.Id = attribute.Id;
            viewModel.AttributeName = attribute.Name;
            attributeViewModels.Add(viewModel);
        }



        return View(attributeViewModels);
    }

    //
    // GET: /Attribute/Details/5
    public ActionResult Details(int id)
    {
        return View();
    }

    //
    // GET: /Attribute/Create
    public ActionResult Create()
    {
        ViewData["CategoryID"] = new SelectList(_cRepository.GetAll().ToList(), "Category_id", "Category");
        IEnumerable<SelectListItem> items = _cRepository.GetAll().Select(c => new SelectListItem
                                            {
                                                Value = c.Id.ToString(),
                                                Text = c.Name
                                            });

        ViewData["CategoryID"] = items;

        return View();
    }

    //
    // POST: /Attribute/Create
    [HttpPost]
    public ActionResult Create(FormCollection collection)
    {
        try
        {
            // TODO: Add insert logic here

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }
公共类属性控制器:控制器
{
私人只读电子存储库(即存储库);;
私人只读电子储蓄(cRepository);;
公共属性控制器():此(新存储库(),新存储库())
{ 
}
公共属性控制器(易趣回购、易趣存储库)
{
_A储蓄=回购;
_cRepository=存储库;
}
//
//获取:/Attribute/
公共行动结果索引()
{
var attributes=_aRepository.GetAll();
var attributeViewModels=新列表();
foreach(属性中的ClassLibrary.Entities.Attribute属性)
{
var viewModel=new AttributeViewModel();
viewModel.Id=attribute.Id;
viewModel.AttributeName=属性.Name;
添加(视图模型);
}
返回视图(attributeViewModels);
}
//
//获取:/Attribute/Details/5
公共行动结果详细信息(int id)
{
返回视图();
}
//
//获取:/Attribute/Create
公共操作结果创建()
{
ViewData[“CategoryID”]=新的选择列表(_cRepository.GetAll().ToList(),“Category\u id”,“Category”);
IEnumerable items=\u cRepository.GetAll().Select(c=>newselectListItem
{
Value=c.Id.ToString(),
Text=c.名称
});
ViewData[“CategoryID”]=项目;
返回视图();
}
//
//POST:/Attribute/Create
[HttpPost]
公共操作结果创建(FormCollection集合)
{
尝试
{
//TODO:在此处添加插入逻辑
返回操作(“索引”);
}
抓住
{
返回视图();
}
}
这是索引视图:

@model IEnumerable<GUI.Models.AttributeViewModel>

@{
  ViewBag.Title = "Attributes";
 }

<div>
@Html.Partial("~/Views/Attribute/Create.cshtml", new GUI.Models.AttributeViewModel())
</div>

<h2>All existing Attributes</h2>



<table class="table">
<tr>
    <th>
        @Html.DisplayNameFor(model => model.AttributeName)
    </th>
    <th></th>
 </tr>

@if(Model != null)
{ 
  foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.AttributeName)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
        @Html.ActionLink("Details", "Details", new { id=item.Id }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.Id })
    </td>
</tr>
}
}

</table>
@model IEnumerable
@{
ViewBag.Title=“属性”;
}
@Html.Partial(“~/Views/Attribute/Create.cshtml”,new GUI.Models.AttributeViewModel())
所有现有属性
@DisplayNameFor(model=>model.AttributeName)
@如果(型号!=null)
{ 
foreach(模型中的var项目){
@DisplayFor(modelItem=>item.AttributeName)
@ActionLink(“编辑”,“编辑”,新的{id=item.id})|
@ActionLink(“详细信息”,“详细信息”,新的{id=item.id})|
@ActionLink(“删除”,“删除”,新的{id=item.id})
}
}
以下是索引视图中的部分视图:

@model GUI.Models.AttributeViewModel


@using (Html.BeginForm()) 
{
@Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>Create an attribute for this Category</h4>
    <hr />
    @Html.ValidationSummary(true)

    <div class="form-group">
        @Html.Partial("~/Views/Attribute/CategoryPartial.cshtml", new  GUI.Models.CategoryViewModel())
    <div class="form-group">
        @Html.LabelFor(model => model.AttributeName, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.AttributeName)
            @Html.ValidationMessageFor(model => model.AttributeName)
        </div>
    </div>


    </div>
    </div>
  }


  @section Scripts {
  @Scripts.Render("~/bundles/jqueryval")
  }
@model GUI.Models.AttributeViewModel
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
为此类别创建属性

@Html.ValidationSummary(true) @Html.Partial(“~/Views/Attribute/CategoryPartial.cshtml”,new GUI.Models.CategoryViewModel()) @LabelFor(model=>model.AttributeName,新的{@class=“controllabel col-md-2”}) @EditorFor(model=>model.AttributeName) @Html.ValidationMessageFor(model=>model.AttributeName) } @节脚本{ @Scripts.Render(“~/bundles/jqueryval”) }
最后是部分视图中的CategoryPartialView,该视图将包含下拉列表,用户应能够在其中选择类别名称

@model GUI.Models.CategoryViewModel
@using GUI.Controllers

@using System.Collections.Generic
@{
//var categories = (IEnumerable<GUI.Models.CategoryViewModel>)ViewData["categories"];
 }


@using (Html.BeginForm()) 
{
@Html.AntiForgeryToken()



    <hr />
    @Html.ValidationSummary(true)

    <div class="form-group">
        @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
          @Html.DropDownList("CategoryID", (IEnumerable<SelectListItem>)ViewData["CategoryID"])
        </div>
    </div>     


   }
@model GUI.Models.CategoryViewModel
@使用GUI.Controllers
@使用System.Collections.Generic
@{
//变量类别=(IEnumerable)视图数据[“类别”];
}
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()

@Html.ValidationSummary(true) @LabelFor(model=>model.Name,新的{@class=“controllabel col-md-2”}) @Html.DropDownList(“CategoryID”,(IEnumerable)ViewData[“CategoryID”]) }
当我调试应用程序时,异常总是发生,它指向@Html.DropDownList部分。声称“没有类型为'IEnumerable'的ViewData项具有键'CategoryID'

@Html.DropDownList(“CategoryID”,(IEnumerable)ViewData[“CategoryID”]
我很抱歉发布了这么多代码块。但我真的很想解决这个问题。我已经沮丧地把头撞在墙上好几个小时了,任何帮助都将不胜感激。

打电话时:

@Html.Partial("~/Views/Attribute/Create.cshtml", new GUI.Models.AttributeViewModel())
您直接调用视图,而无需抛出控制器,因此您拥有的模型是一个空模型

尝试通过抛出控制器来创建您的模型,并将其作为视图发送回:

@Html.RenderPartial("YOUR CONTROLLER",model);

当您使用
@Html.Partial(“~/Views/Attribute/CategoryPartial.cshtml”,new GUI.Models.CategoryViewModel())
时,您直接实例化了部分视图。控制器不会被调用,也不负责生成Html标记字符串。此外,您传递的是一个空视图模型(
new GUI.Models.CategoryViewModel()
)。由于未调用控制器,因此它不会获取下拉列表中的数据,并且显然不会将其保存在
视图数据中

请改用
@Html.Action
帮助程序:

<div class="form-group">
    @Html.Action("Create", "Attribute")
<div class="form-group">

注意:我不知道您的整个结构,但我最好使用这种方法并返回
Lis
模型。

查看数据字典不会“继承”。您需要在每个(部分)中重置它视图,直到您达到目标。您可能需要在重置期间更改其名称…顺便说一句,我不知道在何处以及如何更改
<div class="form-group">
    @Html.Action("Create", "Attribute")
<div class="form-group">
//
// GET: /Attribute/Create
public ActionResult Create()
{
    ViewData["CategoryID"] = new SelectList(_cRepository.GetAll().ToList(), "Category_id", "Category");
    IEnumerable<SelectListItem> items = _cRepository.GetAll().Select(c => new SelectListItem
                                        {
                                            Value = c.Id.ToString(),
                                            Text = c.Name
                                        });

    ViewData["CategoryID"] = items;

    return PartialView("CategoryPartial", new GUI.Models.CategoryViewModel());
}