MVC3使用下拉列表模型和其他模型在同一视图中

时间:2012-12-03 18:03:53

标签: asp.net-mvc-3 view drop-down-menu model visual-studio-2012

我正在使用this example来制作下拉列表。它运行良好,直到我在我的视图中调用模型的方式进行一些更改。 dropdownlist模型类称为dropdownModel。因为我的视图包含2个模型,所以我创建了一个“大”模型类BigModelClass来保存我的两个模型。

大模型看起来像这样

public class BigModelClass {
   public DropDownModel dropDownModel { get; set; }
   public IEnumerable<projectname.Model.model2> var2 { get; set; }
}

在我看来,我将模型称为:

@model BigModel

现在在我看来,我打电话使用下拉列表如下:

@Html.LabelFor(m => m.dropDownModel.State)
@Html.DropDownListFor(m => m.dropDownModel.State,
                 new SelectList(Model.dropDownModel.StateList, "Value", "Text"))
<span class="required"></span>
@Html.ValidationMessageFor(m => m.dropDownModel.State)

不幸的是,我收到以下错误:

  

System.NullReferenceException:未将对象引用设置为对象的实例。

就行了

  

@ Html.DropDownListFor(m =&gt; m.dropDownModel.State,new SelectList(Model.dropDownModel.StateList,“Value”,“Text”))

如果我只使用dropDownModel模型,那么一切正常。

非常感谢任何帮助

修改 视图的控制器:

public ActionResult Index(){
   return View (new BigModelClass());
}

3 个答案:

答案 0 :(得分:2)

假设您直接从该示例复制了DropDownModel,您需要向BigModelClass添加构造函数并在那里实例化dropDownModel。

public class BigModelClass {
   public DropDownModel dropDownModel { get; set; }
   public IEnumerable<projectname.Model.model2> var2 { get; set; }

   public BigModelClass() {
      dropDownModel = new DropDownModel();
   }
}

或者,在您的控制器中,实例化dropdownmodel:

public ActionResult Index(){
   return View (new BigModelClass {
         dropDownModel = new DropDownModel()
   });
}

答案 1 :(得分:1)

您的Model.dropDownModel很可能为null,我很确定您不会在默认构造函数BigModelClass()中实例化它。当属性定义m => m.dropDownModel.State正常时,它无法返回项集合的实例:Model.dropDownModel.StateList

答案 2 :(得分:0)

发生此问题的原因是您未将数据绑定到下拉列表。您必须将数据绑定到控制器操作中的下拉列表中。如果要绑定控制器操作的数据,请确保它还绑定在[httppost]控制器操作中,用于modelstate.valid为false。

    public ActionResult Register()
    {
        RegisterModel model = new RegisterModel();
        List<SequrityQuestion> AllSequrityQuestion = new List<SequrityQuestion>();
        model.SequrityQuestions = GetAllSequrityQuestion();

        return View(model);
    }

     [HttpPost]
    public ActionResult Register(RegisterModel model)
    {
        if (!ModelState.IsValid)
        {
            // there was a validation error =>
            // rebind categories and redisplay view

            model.SequrityQuestions = GetAllSequrityQuestion();
        }
        if (ModelState.IsValid)
        {
            // Your code to post
        }

        return View(model);
    }

在上面的例子中,寄存器模型中有一个名为SequrityQuestions的下拉列表。我想这就是你遇到这个问题的原因。确保在modelstate.valid false的情况下将数据绑定到dropdownlist,那么你的问题就会消失。