ViewModel没有回发

时间:2014-06-29 15:50:44

标签: asp.net-mvc forms postback

我在控制器中有这个:

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总是回来为null。我读了很多关于必须将Id分配给复选框等但我认为这是Html.CheckBoxFor的用途。

我确信我会在某些时候对此表示不满,但我可以提供一些指导。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

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

在你的POST动作中

尝试:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(IEnumerable<IndexViewModel> viewModels)
{
    return View(viewModels); 
}

希望会有所帮助。