MVC Viewmodel部分为空

时间:2016-10-25 08:15:03

标签: c# asp.net-mvc asp.net-mvc-4

我的视图绑定到此模型

 public class HomepageViewModel
{
    public HomepageViewModel()
    {
        Regions = new List<TMRegion>();
    }

    public List<TMRegion> Regions { get; set; }

    public int SelectedRegion { get; set; }

    public SelectList SelectListRegions
    {
        get
        {
            List<SelectListItem> items = new List<SelectListItem>();
            foreach (var tmRegion in Regions)
            {
                items.Add(new SelectListItem()
                {
                    Value = tmRegion.Value.ToString(),
                    Text = tmRegion.Display
                });
            }
            return new SelectList(items);
        }
    }
}

我的观点是这样的 -

@model ProSell.Admin.Models.ViewModels.HomepageViewModel

@using (Html.BeginForm("Index", "Search", FormMethod.Post, new { viewModel = Model }))
{
    @Html.HiddenFor(m=>m.Regions)


    @Html.DropDownListFor(model => model.SelectedRegion, Model.SelectListRegions.Items as List<SelectListItem>, "Select a region")

<input type="submit"/>

}

我的控制器填充像这样的区域 -

 // GET: Search
    public async Task<ViewResult> Index(HomepageViewModel viewModel)
    {
        if (viewModel.Regions.Count == 0)
        {
            viewModel = new HomepageViewModel();
            JavaScriptSerializer js = new JavaScriptSerializer();
            viewModel.Regions = 
                js.Deserialize<TMRegion[]>(
                    await _ApiConsumer.ExecuteGetMethod("myurlinhere"))
                    .ToList();

        }

        return View(viewModel);
    }

在视图中填充下拉列表。当我选择一个区域并提交HomepageViewModel时,SelectedRegion已正确设置为所选的任何ID,但Regions的集合为空。

如何在提交模型中维护列表?

1 个答案:

答案 0 :(得分:1)

通常,您应该尝试减少客户端发送回服务器的数据量,特别是使用集合,因为服务器进行数据库调用以检索集合的效率远远高于它传回的数据集。表格数据。

正如斯蒂芬所说,您可以从控制器重新填充集合Regions,或者由于ModelState错误而在返回视图时需要它,您可以将填充代码添加到模型中。构造函数。

您也可以像这样清理您的收藏品:

public IEnumerable<SelectListItem> SelectListRegions
{
    get
    {
        return Regions.Select(x => new SelectListItem
        {
            Text = x.Display,
            Value = x.Value.ToString()
        });
    }
}

并在您的视图中:

@Html.DropDownListFor(model => model.SelectedRegion, Model.SelectListRegions, "Select a region")