2014-01-22 12 views
4

我的控制器在我的视图中填充了我的模型,其中列出了strings,它出现在DropDownList中。当视图回发给我的控制器时,该列表突然变为null。为什么它是空的,以及我创建的字符串列表发生了什么?MVC在回传中列表为空

该列表已正确填充并显示在视图中。表单元素的其余部分将正确回传。例如,selectedName具有用户点击的任何名称。唯一不回传的是nameList

这里是我的模型的相关部分,

public class MyModel 
{ 
    [Display(Name = "Selected")] 
    public string selectedName{ get; set; } 
    [Display(Name = "Names")] 
    public List<string> nameList{ get; set; } 
} 

相关的获取和我的控制器的后部分,

public class MyController: Controller 
{ 
    [HttpGet] 
    public ActionResult Index() 
    { 
     List<string> nameList= getNames(); 
     MyModel model = new MyModel() 
     model.nameList= nameList; 
     // Now, model.nameList has a bunch of stuff in it 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyModel model) 
    { 
     if(model.nameList== null) 
     { 
      cry(); 
      postOnStackOverflow(); 
     } 
     return View(model); 
    } 
} 

和我查看相关部分(被封装的内部表单)。

<p> 
    @Html.LabelFor(c => c.nameList): 
@Html.DropDownListFor(c => c.selectedName, new SelectList(Model.nameList), new { onchange = "this.form.submit();" }) 
</p> 
+0

我在您的模型中看不到'names'属性 –

+0

@ Selman22对不起,这是一个错字。我改变了很多变量名以符合我的工作政策。现在纠正它。 – Rainbolt

回答

2

发布表单时只发布下拉列表的值。我假设你的控制是在一个窗体上。

我不知道你为什么要总是回到你张贴的观点,但你需要重新填充列表:

[HttpPost] 
    public ActionResult Index(MyModel model) 
    { 
     List<string> names = getNames(); 

     model.nameList = names; 
     return View(model); 
    } 
+0

另一种方法是将名称列表作为模型的成员。那么就没有必要记住重新填充它。 –

+0

它已经是一个成员,但它没有被公布,因为它没有被保存在窗体上的任何控件的值中。 – Maess

+0

我还不清楚 - 对不起 - 我的意思是让列表成为模型的成员,并让模型自己创建列表,无论是在列表的getter中,还是在构造函数中。 –

1

这是预期的行为考虑你有你的观点。您需要重新加载名称列表集合属性,以确保您将模型返回到同一个视图。

[HttpPost] 
public ActionResult Index(MyModel model) 
{ 
    if(ModelState.IsValid) 
    { 
    // Save and redirect 
    } 
    //reload the collection again and return the model to the view 
    model.nameList=getNames(); 
    return View(model); 
} 
+0

在每次回传中重建整个列表似乎效率不高。我从一个XML文件中读取我的名单,这是很昂贵的。我已经建立了一个列表,我想避免再次构建它。我的问题是“我已经创建的名称列表发生了什么?“ – Rainbolt

+0

除非它不存储在表单元素中,否则它将不可用。您可能会缓存从XML文件读取的数据并使用它重新加载。 – Shyju