C# 传递给控制器时,具有复杂类型的视图模型为空

C# 传递给控制器时,具有复杂类型的视图模型为空,c#,asp.net-mvc,razor,model-view-controller,viewmodel,C#,Asp.net Mvc,Razor,Model View Controller,Viewmodel,我正在尝试将具有复杂类型的视图模型传递给我的控制器。我已经研究了所有我能从上到下研究这个问题的东西,但我仍然感到困惑 问题: 单击“提交”按钮时,会传入视图模型,但MacroInfo属性列表为空 更新索引模型 public class UpdateIndexViewModel { //This view model will become larger later public List<MacroInfo> MacrosToUpdate { get; set; }

我正在尝试将具有复杂类型的视图模型传递给我的控制器。我已经研究了所有我能从上到下研究这个问题的东西,但我仍然感到困惑

问题:

单击“提交”按钮时,会传入视图模型,但MacroInfo属性列表为空

更新索引模型

public class UpdateIndexViewModel
{
    //This view model will become larger later
    public List<MacroInfo> MacrosToUpdate { get; set; }
}
控制器动作

[HttpPost]
public ActionResult Submit(UpdateIndexViewModel updateIndexViewModel)
{
    //updateIndexViewModel.MacrosToUpdate is null ??
}
索引视图

@model EplanInterface.Core.ViewModels.UpdateIndexViewModel

@using (Html.BeginForm("Submit", "Update", FormMethod.Post))
{
    <table style="width:100%" , class="table-bordered">
        <thead>
            <tr>
                <th>#</th>
                <th>Macro Path</th>
                <th>Created At</th>
                <th>Update</th>
            </tr>
        </thead>
        @for (int i = 1; i < Model.MacrosToUpdate.Count; i++)
        {
            <tr>
                <td>@Html.TextBoxFor(m =>Model.MacrosToUpdate[i].FullPath)</td>
                <td>@Html.TextBoxFor(m => Model.MacrosToUpdate[i].CreatedAt)</td>
                <td>@Html.CheckBoxFor(b => Model.MacrosToUpdate[i].IsSelected)</td>
            </tr>
        }
    </table>
    <input type="submit" class="btn btn-primary" value="Submit"/>
}
@model EplanInterface.Core.ViewModels.UpdateIndexViewModel
@使用(Html.BeginForm(“提交”、“更新”、FormMethod.Post))
{
#
宏路径
创建于
更新
@对于(int i=1;iModel.MacrosToUpdate[i].FullPath)
@Html.TextBoxFor(m=>Model.MacrosToUpdate[i].CreatedAt)
@(b=>Model.MacrosToUpdate[i].IsSelected)的Html.CheckBoxFor
}
}
我尝试过的

我尝试将传入的控制器操作属性更改为
列表宏更新
,但执行此操作时,该属性仍然为空

铬网检测

[HttpPost]
public ActionResult Submit(UpdateIndexViewModel updateIndexViewModel)
{
    //updateIndexViewModel.MacrosToUpdate is null ??
}

最后的评论

我不确定是否需要使用AJAX post来完成此操作,或者我的变量名是否格式不正确。我很确定这是一个我不理解的有约束力的问题


如果有人能给我指出正确的方向,我将非常感激。

您的模板的这一部分有点错误

@for (int i = 1; i < Model.MacrosToUpdate.Count; i++)
{
    <tr>
        <td>@Html.TextBoxFor(m =>Model.MacrosToUpdate[i].FullPath)</td>
        <td>@Html.TextBoxFor(m => Model.MacrosToUpdate[i].CreatedAt)</td>
        <td>@Html.CheckBoxFor(b => Model.MacrosToUpdate[i].IsSelected)</td>
    </tr>
}
@for(int i=1;iModel.MacrosToUpdate[i].FullPath)
@Html.TextBoxFor(m=>Model.MacrosToUpdate[i].CreatedAt)
@(b=>Model.MacrosToUpdate[i].IsSelected)的Html.CheckBoxFor
}
请更改以下内容,然后重试

@for (int i = 0; i < Model.MacrosToUpdate.Count; 
{
        <tr>
            <td>@i</td>
            <td>@Html.TextBoxFor(m => m.MacrosToUpdate[i].FullPath)</td>
            <td>@Html.TextBoxFor(m => m.MacrosToUpdate[i].CreatedAt)</td>
            <td>@Html.CheckBoxFor(b => b.MacrosToUpdate[i].IsSelected)</td>
        </tr>
 }
(int i=0;im.MacrosToUpdate[i].FullPath) @Html.TextBoxFor(m=>m.MacrosToUpdate[i].CreatedAt) @(b=>b.MacrosToUpdate[i].IsSelected)的Html.CheckBoxFor }
首先,您以1开始循环,这是根本原因。由于缺少第0个索引,Model binder无法正确绑定列表。

我认为您需要在控制器帖子中将
UpdateIndexViewModel UpdateIndexViewModel
更改为
list macrosToUpdate
method@MuhammadHannan我已经试过了。这是一个好主意lso返回null。