Asp.net mvc 使用ViewModel填充ListBoxfor并传回其内容

Asp.net mvc 使用ViewModel填充ListBoxfor并传回其内容,asp.net-mvc,razor,data-binding,html-helper,Asp.net Mvc,Razor,Data Binding,Html Helper,我正在努力找出如何将我的模型(未修改)传回控制器。我已经尝试将我的ViewModel绑定到许多不同的HTML.Helper之类的东西。我可以将数据绑定并显示,但无法将ViewModel发回控制器 我有以下视图模型: public class MediaProviderViewModel : ViewModelBase { public int MediaProviderId { get; set; } public string MediaProviderName { get;

我正在努力找出如何将我的模型(未修改)传回控制器。我已经尝试将我的ViewModel绑定到许多不同的HTML.Helper之类的东西。我可以将数据绑定并显示,但无法将ViewModel发回控制器

我有以下视图模型:

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)
            };
    }    
}
视图:


还是什么也没有传回来。关于我做错了什么,我能得到一些帮助吗?我试着在谷歌上搜索,但我的案例中没有发现任何真正有价值的东西

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


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

是否可能我使用此控件时出错?我的最终目标是从列表中获取所有值。它们实际上不需要是可选择的。我应该走另一条路吗?我还应该补充一点,我需要将Id和MediaProviderName发送回控制器。所有这些都在列表中。那么是的,这不是要使用的控件。您应该能够使用for循环为
MediaProviderViewModel
的每个属性呈现输入。例如(int i=0;im.MediaProviders[i].MediaProviderId;…}。注意,您需要将
MediaProviders
更改为
IList
,以便使用索引。或者,您可以为
MediaProviderViewModel
创建自定义编辑器模板,并使用
@Html.EditorFor(m=>m.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>
model => model.MediaProviders[i].MediaProviderId
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" })