从另一个控制器填充视图中的下拉列表

Populate Dropdown in View from another Controller

我正在尝试从另一个控制器填充下拉菜单。我的 DeviceController 有一个 @Html.DropDownList 被填充。最初我有在控制器中填充 DropDown 的代码。现在我正试图将它移动到指定用于下拉菜单的控制器。所以我有代码在一个位置填充下拉列表,而不是在多个控制器中使用相同的代码。当我在原始控制器中使用下拉菜单时,它会正确加载,但是当我将其移动到 DropDown 控制器时,我收到以下错误 There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'DropDownDeviceType'.

我的观点的代码 -

  @Html.DropDownList("DropDownDeviceType", null, htmlAttributes: new { @class = "form-control" })

来自我的 DropDownController(如果我的 DeviceController 中有此代码,它会按预期工作)

public void PopulateDevciceType(object selectDeviceType = null)
    {
        string voidInd = "N";
        var deviceType = db.DeviceTypes
            .Where(x => x.VoidInd == voidInd)
            .OrderBy(x => x.DeviceType1);

        //ViewData["DropDownDeviceType"] = new SelectList(deviceType, "DeviceTypeID", "DeviceType1", selectDeviceType);
        ViewBag.DropDownDeviceType = new SelectList(deviceType, "DeviceTypeID", "DeviceType1", selectDeviceType);

    }

在我的 DeviceController 中

 //Populate dropdowns
    DropDownController dropDown = new DropDownController();
    dropDown.PopulateDevciceType(model.DeviceTypeID);

我理解您希望将某些任务外包给专门的 classes。不过,我觉得你有点想多了。

我不是 100% 确定这个错误实际上告诉了你什么代码,但看起来你可能有一些不稳定的视图 returns 因为你在其中设置了 ViewBag 信息一个不同于 return 视图的控制器。我对那部分的理解正确吗?

与其创建另一个控制器 class,不如在某处创建一个静态函数来处理列表创建并且仅处理列表创建。当它创建一个列表时,让它return它。

然后,每当您需要填充列表时,在相关的控制器方法中执行此操作:

ViewBag.DropDownDeviceType= *wherever-your-static-method-is*.PopulateDeviceType(model.DeviceTypeID);