使用ViewModel填充ListBoxfor并传回其内容

时间:2014-08-27 04:58:53

标签: asp.net-mvc razor data-binding html-helper

我正在努力弄清楚如何将我的模型(未修改)传回给我的控制器。我已经尝试将我的ViewModel绑定到许多不同的HTML.Helpers而不是。我可以将我的数据绑定并显示,但我无法让ViewModel回发给我的控制器。

我有以下ViewModels:

public class MediaProviderViewModel : ViewModelBase
{
    public int MediaProviderId { get; set; }
    public string MediaProviderName { get; set; }

    public static MediaProviderViewModel FromEntity(MediaProvider entity)
    {
        if (entity == null)
        {
            return (null);
        }
        return (new MediaProviderViewModel()
        {
            MediaProviderId = entity.MediaProviderId,
            MediaProviderName  = entity.Name,

        });
    }

    public static IEnumerable<MediaProviderViewModel> FromEntityList(IEnumerable<MediaProvider> entities)
    {
        return entities == null ? null : entities.Select(FromEntity).OrderBy(mp => mp.MediaProviderName);
    }
}


  public class SystemConfigViewModel : ViewModelBase
{
    [DisplayName("Media Providers")]
    public IEnumerable<MediaProviderViewModel> MediaProviders { get; set; }

    public SystemConfigViewModel()
    {
    }

    public static SystemConfigViewModel FromEntity(Entities db)
    {
        return new SystemConfigViewModel()
            {
                MediaProviders = MediaProviderViewModel.FromEntityList(db.MediaProviders)
            };
    }    
}

控制器:

public class SystemConfigController : CommonBaseController
{
    //
    // GET: /SystemConfig/

    public ActionResult Index()
    {
        SystemConfigViewModel model = SystemConfigViewModel.FromEntity(_db);
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(SystemConfigViewModel model)
    {

        return View(model);
    }

查看:

<html>
  <body>
    @using (Html.BeginForm("Index", "SystemConfig"))
    {    
        @Html.ListBoxFor(model => model.MediaProviders, new SelectList(Model.MediaProviders, "MediaProviderId", "MediaProviderName"), new { @size = "30" })       
    }
  </body>
</html>

我试过迭代这些项目并将它们编入索引:

//用不同帮助者的for循环包围

model => model.MediaProviders[i].MediaProviderId

仍然没有传回来。关于我做错了什么,我能得到一些帮助吗?我试过谷歌搜索,但没有真正的价值突然出现在我的情况下。

1 个答案:

答案 0 :(得分:3)

您应该在视图模型中包含一个附加属性以将所选值绑定到(并将MediaProviders更改为SelectList也会使其更容易)

public class SystemConfigViewModel : ViewModelBase
{
  public IEnumerable<int> SelectedProviders { get; set; } //bind to this    
  public SelectList MediaProviders { get; set; } // populate this in the controller
}

然后在视图中

@Html.ListBoxFor(m=> m.SelectedProviders , Model.MediaProviders, new { @size = "30" })

当您回发时,SelectedProviders属性将包含所选项目的ID(MediaProviderId)。