2014-06-29 52 views
0

我有这个在我的控制器:视图模型不回发

public ActionResult Index() 
{ 
    var viewModels = _dataSyncService.Get().Select(provider => new IndexViewModel 
    { 
     Selected = false, Provider = provider 
    }).ToList(); 

    return View(viewModels); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Index(IEnumerable<IndexViewModel> viewModels) 
{ 
    //Breakpoint on this to check viewModels 
} 

视图模型:

public class IndexViewModel 
{ 
    public bool Selected { get; set; } 

    public IDataSyncProvider Provider { get; set; } 
} 

而且我Index.cshtml:

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <button type="submit" class="btn blue">Trigger Selected</button> 

    @foreach (var sync in Model) 
    { 
     <tr> 
      <td> 
       @Html.CheckBoxFor(s => sync.Selected) 
      </td> 
      <td>@sync.Provider.FriendlyName</td> 
     </tr> 
    } 
} 

但我的模型贴后背, viewModels总是返回为空。我读了很多关于必须分配Id的复选框等,但我认为这就是Html.CheckBoxFor是。

我敢肯定,我会在某个时候自我点亮,但我可以做一些指导。

回答

2

如果你想使用内置的HTML辅助就像Html.CheckBoxFor,那么你需要使用for循环,而不是foreach为了给助手解析正确的输入名称:

@for(int sync = 0; sync < Model.Count; sync++) 
{ 
    <tr> 
     <td> 
      @Html.CheckBoxFor(m => Model[sync].Selected) 
     </td> 
     <td>@Model[sync].Provider.FriendlyName</td> 
    </tr> 
} 

你可以阅读更多关于绑定到列表在这里:Model Binding To A List

+0

啊,我见过的例子是这样做的,但我认为那只是他们的偏好。我会放弃它。 – webnoob

+0

这不是一个偏好。如果要绑定到集合,输入名称必须遵循链接文章中离散的方案。如果你在里面使用数组索引器,助手只会生成这个名字。所以如果你维护一个单独的索引并在助手中使用索引器,那么你仍然可以使用'foreach',但在这种情况下'foreach'不会给你买任何东西,所以用一个简单的for循环更容易。 – nemesv

+0

非常好,现在已经对回发进行了排序(即在打勾并回发时Selected = true),但是我的ViewModel的'Provider'部分没有回传。你知道为什么吗?我试过添加@ Html.HiddenFor(m => Model [i] .Provider)',但这似乎没有帮助。我已经检查了视图模型,当它被分配到视图,它被发送好了。 – webnoob

-1

这是因为,你只是使用return RedirectToAction(“Index”)重定向它;

在您的POST操作

尝试:

希望会有所帮助。

+0

我编辑我的帖子,因为它obviusly不清楚。我在那部分有一个断点,并且在重定向之前检查'viewModels'变量。 – webnoob

+0

这与OP的问题无关,正如评论中所述,'return RedirectToAction'代码仅仅是一个例子。 – nemesv