这是DropDownListFor MVC中的默认行为吗?

时间:2012-09-01 11:13:59

标签: asp.net-mvc

我注意到以下行为并想知道为什么“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;

2 个答案:

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