我的控制器中有以下代码:
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;
在我的.cshtml页面中也是如下:
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.
有人对此提出建议或解释吗?
答案 0 :(得分:0)
使用List<T>
代替IEnumerable<T>
因为IEnumerable<T>
是连续的,从SO回答:
IEnumerable接口的目的是允许使用者查看集合的内容。不要修改值。
var trimName = (List<SelectListItem>)ViewBag.ModelName;
var modelName = (List<SelectListItem>)ViewBag.TrimName;
请参阅此SO post,了解无法在IEnumerable<T>
答案 1 :(得分:0)
如果你的唯一目标是在选择列表中添加一个空项目,那么就有了更简单的方法。 Html.DropDownListFor
使用参数为您设置空项目:
@Html.DropDownListFor(m => m.TrimName, (IEnumerable<SelectListItem>)ViewBag.TrimNameChoices, "Select an Option...")
另请注意,我更改了ViewBag
变量的名称。如果您的模型上的媒体资源为TrimName
,则您无法将选择列表存储在ViewBag.TrimName
中,否则会破坏任何选定的值。总是更好的是,如果您要对选择列表使用ViewBag
,请在结尾处使用Choices
或Options
命名,这样您就不必担心像这样的碰撞。
答案 2 :(得分:0)
<强>模型强>
[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 --")