我注意到以下行为并想知道为什么“Model.CountryList”在POST时为空?如果这是默认的MVC行为,或者我们有什么可以摆脱它?
模型
public class CountryMaster
{
public int CountryCode { get; set; }
public string CountryName { get; set; }
}
视图模型
public class HomeViewModel
{
public int SelectedCountry { get; set; }
public List<CountryMaster> CountryList { get; set; }
}
查看
@model Demo.Web.ViewModels.HomeViewModel
@Html.DropDownListFor(model => model.SelectedCountry, new SelectList(Model.CountryList, "CountryCode", "CountryName"), "---SELECT COUNTRY---" new { @class = "chosen", @onchange = "this.form.action='/Home/Index'; this.form.submit(); " })
DDL上方的注意 - 与两个属性绑定,“SelectedCountry”&amp; “CountryList”。
控制器
在“Index”,HttpGet方法中,获取带有一些数据库命中的“CountryList”,
public ActionResult Index()
{
var homeViewModel = new HomeViewModel();
**//get all countries and fill “CountryList”**
homeViewModel.CountryList = _commonService.GetCountriesList();
return View(homeViewModel);
}
现在当我们在DDL中选择一个项目并点击帖子然后在“Index”,HttpPost中,“SelectedCountry”填充了一些值,但“CountryList”为NULL,为什么?
请帮助理解我为什么“CountryList”为NULL并且有任何方法可以保持相同的状态吗?
[HttpPost]
public ActionResult Index(HomeViewModel homeViewModel)
{
/**/ selectçountryValue = 2**
var selectçountryValue = homeViewModel.SelectedCountry;
**// CountryListAtPost = null**
var CountryListAtPost = homeViewModel.CountryList;
答案 0 :(得分:0)
就HttpPost而言,View将所有FormCollection返回给控制器。因此它始终具有存储在表单元素中的值,即文本框,下拉列表或隐藏字段。
在您的情况下,homeViewModel必须包含SelectedCountry属性的值,因为它在表单集合中并与DropDown元素相关联,但CountryList与任何元素都没有关联,这就是它返回null的原因。
要将集合从视图返回到控制器,请找到this线程。
祝你好运!!
答案 1 :(得分:0)
非常感谢Kundan,多个隐藏字段将解决问题,
@Html.DropDownListFor(model => model.SelectedCountry, new SelectList(Model.CountryList, "CountryCode", "CountryName"), "---SELECT COUNTRY---",
new { @class = "chosen", @onchange = "this.form.action='/Home/Index'; this.form.submit(); " })
@if (Model.CountryList != null)
{
for (int i = 0; i < Model.CountryList.Count; i++)
{
@Html.HiddenFor(model => model.CountryList[i].CountryCode)
@Html.HiddenFor(model => model.CountryList[i].CountryName)
}
}