C# 回发时MVC列表为空
我的控制器用一个列表填充我的模型,该列表包含出现在我视图中的C# 回发时MVC列表为空,c#,asp.net-mvc,html.dropdownlistfor,C#,Asp.net Mvc,Html.dropdownlistfor,我的控制器用一个列表填充我的模型,该列表包含出现在我视图中的下拉列表中的字符串。当视图发布回我的控制器时,该列表突然null。为什么它是空的,我创建的字符串列表发生了什么 列表已正确填充并显示在视图中。表单元素的其余部分可以正确地回发。例如,selectedName具有用户单击的任何名称。唯一没有发回的是姓名列表 这是我模型的相关部分 public class MyModel { [Display(Name = "Selected")] public string selecte
下拉列表中的字符串。当视图发布回我的控制器时,该列表突然null。为什么它是空的,我创建的字符串列表发生了什么
列表已正确填充并显示在视图中。表单元素的其余部分可以正确地回发。例如,selectedName
具有用户单击的任何名称。唯一没有发回的是姓名列表
这是我模型的相关部分
public class MyModel
{
[Display(Name = "Selected")]
public string selectedName{ get; set; }
[Display(Name = "Names")]
public List<string> nameList{ get; set; }
}
公共类MyModel
{
[显示(Name=“选定”)]
公共字符串selectedName{get;set;}
[显示(Name=“Name”)]
公共列表名称列表{get;set;}
}
我的控制器的相关Get和Post部分
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);
}
}
公共类MyController:Controller
{
[HttpGet]
公共行动结果索引()
{
List nameList=getNames();
MyModel模型=新的MyModel()
model.nameList=名称列表;
//现在,model.nameList里面有很多东西
返回视图(模型);
}
[HttpPost]
公共行动结果索引(MyModel)
{
if(model.nameList==null)
{
哭();
postOnStackOverflow();
}
返回视图(模型);
}
}
以及我的观点的相关部分(封装在表单中)
@Html.LabelFor(c=>c.nameList):
@DropDownListFor(c=>c.selectedName,new SelectList(Model.nameList),new{onchange=“this.form.submit();”})
发布表单时,仅发布下拉列表的值。我假设你的控制权在表格上
我不确定您为什么希望始终返回到您发布的视图,但您需要重新填充列表:
[HttpPost]
public ActionResult Index(MyModel model)
{
List<string> names = getNames();
model.nameList = names;
return View(model);
}
[HttpPost]
公共行动结果索引(MyModel)
{
列表名称=getNames();
model.nameList=名称;
返回视图(模型);
}
考虑到您的观点,这是预期的行为。如果要再次将模型返回到同一视图,则需要重新加载“名称列表”集合属性
[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);
}
我在您的中找不到names
属性model@Selman22对不起,那是个打字错误。我更改了很多变量名,以符合我的工作策略。现在更正它。另一种方法是让名字列表成为模型的成员。那么就不需要记得重新填充它了。它已经是一个成员了,但是它没有被发回,因为它不在表单上的任何控件的值中。我不清楚-抱歉-我的意思是让构建列表的方法成为模型的成员,让模型自己构建列表,或者在列表的getter中,或者在构造器或其他东西中。这不是模型绑定的工作方式。列表必须是作为表单一部分的控件的值,否则它就不是post的一部分。如果不创建自定义模型绑定器,就没有好的方法可以做到这一点,不。在每次回发上重建整个列表似乎效率不高。我从XML文件中读取我的姓名列表,这很昂贵。我已经构建了一次列表,我希望避免再次构建它。我的问题是“我已经创建的名称列表怎么了?”除非它不是存储在表单元素中,否则它将不可用。您可以缓存从XML文件读取的数据,并使用该数据重新加载。
[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);
}