(IEnumerable<;SelectListItem>;)ViewBag.Name在ASP.Net中不起作用

本文关键字:ASP Net 不起作用 Name lt IEnumerable SelectListItem gt ViewBag | 更新日期: 2023-09-27 18:26:57

我的控制器中有一个代码:

var getAllModel =
            VehicleManager.GetAllModelsByMakeId(getMakeId.MakeId)
                .Select(c => new SelectListItem {Text = c.Name, Value = c.ModelId.ToString()})
                .ToList();
var getAllTrim =
            VehicleManager.GetAllTrimByModelId(getModelId.ModelId)
                .Select(c => new SelectListItem {Text = c.Name, Value = c.TrimId.ToString()}).ToList();
ViewBag.ModelName = getAllModel;
ViewBag.TrimName= getAllTrim;

在我的.cs.html页面中,也在下面:

var trimName = (IEnumerable<SelectListItem>)ViewBag.ModelName;
var modelName = (IEnumerable<SelectListItem>)ViewBag.TrimName;

现在我想插入一个trimName.Insert(0, new SelectListItem {Text= "Select", Value = ""}),但无法访问。

这是我遇到的问题:Object reference not set to an instance of an object.有人对此有什么建议或解释吗?

(IEnumerable<;SelectListItem>;)ViewBag.Name在ASP.Net中不起作用

使用List<T>而不是IEnumerable<T>,因为IEnumerable<T>是连续的,来自SO答案:

IEnumerable接口的目的是允许使用者查看集合的内容。不修改值。

var trimName = (List<SelectListItem>)ViewBag.ModelName;
var modelName = (List<SelectListItem>)ViewBag.TrimName;

请参阅此SO帖子,了解为什么不能在IEnumerable<T> 中添加项目

如果您的唯一目标是向选择列表中添加一个空项目,那么有一种更简单的方法。Html.DropDownListFor使用一个参数为您设置一个空项目:

@Html.DropDownListFor(m => m.TrimName, (IEnumerable<SelectListItem>)ViewBag.TrimNameChoices, "Select an Option...")

另外,请注意,我更改了ViewBag变量的名称。如果你的模型上的属性是TrimName,你不能将你的选择列表存储在ViewBag.TrimName中,否则它会破坏任何选定的值。如果您要对选择列表使用ViewBag,那么最好在末尾使用ChoicesOptions之类的名称来命名它们,这样您就不必担心这样的冲突。

型号

[Required]
[Display(Name = "Trim Name")]
public string TrimName{ get; set; }

控制器:

var getAllTrim =
            VehicleManager.GetAllTrimByModelId(getModelId.ModelId)
        .Select(c => new SelectListItem {Text = c.Name, Value = c.TrimId.ToString()})
        .ToList();
ViewBag.TrimList= getAllTrim;

查看

@Html.DropDownListFor(model => model.TrimName, 
                  (IEnumerable<SelectListItem>)ViewBag.TrimList, "-- Select --")