Skip to main content
 首页 » 编程设计

c#之列表的 Ajax BeginForm 仅返回模型的第一个元素或 null

2024年02月27日33飞鱼

我正在尝试使用 ajax-beginform 调用一个 Action 。

这是我的模型:

public class MyViewModel 
{ 
    public List<SubViewModel> SubViewModels {get;set;} 
} 
 
public class SubViewModel 
{ 
    public string Name {get;set;} 
    public int Age {get;set;} 
    public bool Active {get;set;} 
} 

我的 View 如下所示:(我正在遍历所有 SubViewModel-Items,并希望稍后在我的 DoAction-Method 中取回它们)

@model MyViewModel 
 
@using (Ajax.BeginForm("DoAction", "MyController", null, new AjaxOptions() { HttpMethod = "Post" }, new { @class = "search-form", enctype = "multipart/form-data" })) 
{ 
<table class="table"> 
        <thead> 
            <tr> 
                <th>Name</th> 
                <th>Age</th> 
                <th>Active</th> 
            </tr> 
        </thead> 
        <tbody> 
            @foreach (var item in Model.SubViewModels) 
            { 
                <tr> 
                    <td><input type="text" name="Name" value="@item.Name" /></td> 
                    <td><input type="text" name="Age" value="@item.Age" /></td> 
                    <td><input type="checkbox" name="Active" value="@item.Active" /></td> 
                </tr> 
            } 
        </tbody> 
        </table> 
    <input type="submit" value="OK" /> 
} 

这是我的 Action :

[System.Web.Mvc.HttpPost] 
public async Task DoAction([FromBody] MyViewModel model) 
{ 
    // here model is null 
} 

它总是在 DoAction 中遇到断点但是:

  • 如果模型类型是MyViewModel , 属性(property) SubViewModels为空。
  • 如果模型类型是IEnumerable<SubViewModel> ,模型为空。
  • 如果模型类型是SubViewModel ,第一个数据集在参数中。

所以我猜,这个 ajax 操作的正确参数来自类型 SubViewModel .

但我需要 MyViewModel或 IEnumerable<SubViewModel>获取所有列出的模型项目。

请您参考如下方法:

您需要为输入命名,以便模型绑定(bind)器可以适本地绑定(bind)发布数据。现在,列表中的每个项目都通过相同的属性名称发布:Name、Age 和 Active。您实际需要的是像 SubViewModels[N].Name 这样的名称,其中 N 是一个整数索引值。执行此操作的最简单方法是实际使用 HTML 帮助程序生成输入,并且您还需要使用 for 循环,而不是 foreach:

@for (var i = 0; i < Model.SubViewModels.Count(); i++) 
{ 
    <tr> 
        <td>@Html.TextBoxFor(m => m.SubViewModels[i].Name)</td> 
        <td>@Html.TextBoxFor(m => m.SubViewModels[i].Age)</td> 
        <td>@Html.CheckBoxFor(m => m.SubViewModels[i].Name)</td> 
    </tr> 
}