(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.
有人对此有什么建议或解释吗?
使用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
,那么最好在末尾使用Choices
或Options
之类的名称来命名它们,这样您就不必担心这样的冲突。
型号
[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 --")