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

时间:2014-10-17 15:30:42

标签: c# asp.net-mvc

我的控制器中有以下代码:

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. 有人对此提出建议或解释吗?

3 个答案:

答案 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,请在结尾处使用ChoicesOptions命名,这样您就不必担心像这样的碰撞。

答案 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 --")