为啥复选框选择列表总是在 ASP.NET MVC-5 中发布为 null [重复]

Posted

技术标签:

【中文标题】为啥复选框选择列表总是在 ASP.NET MVC-5 中发布为 null [重复]【英文标题】:Why list of checkbox selections always posted as null in ASP.NET MVC-5 [duplicate]为什么复选框选择列表总是在 ASP.NET MVC-5 中发布为 null [重复] 【发布时间】:2017-09-10 05:51:16 【问题描述】:

我是 ASP .NET MVC 的新手。我的问题是 - 我想“发布”项目的集合,以便控制器可以处理它。 我的模型是 -

public class CheckedRentalProperty

   public bool IsSelected  get; set; 
   public int Id  get; set; 
   public String Address  get; set; 

我的控制器是这样定义的 -

public class RentalPropertiesController : Controller

    public ActionResult Index()
    
        List<CheckedRentalProperty> checkHsList = new List<CheckedRentalProperty>();
        // Fill the list
        return View(checkHsList);
    

    [HttpPost]
    public ActionResult Save(IEnumerable<CheckedRentalProperty> checkHsList)
    
        // why checkHsList is coming as null ??
    

而且视图是这样的-

@model IEnumerable<XXX.Models.CheckedRentalProperty>

@using (html.BeginForm("Save", "RentalProperties", FormMethod.Post))

    <div class="form-horizontal">
        <div class="form-group">
            <table class="table">
                <tr>
                    <th>

                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.Address)
                    </th>

                </tr>

                @foreach (var item in Model)
                
                    <tr>
                        <td>@Html.CheckBoxFor(modelItem => item.IsSelected)</td>

                        <td>
                            @Html.DisplayFor(modelItem => item.Address)
                        </td>
                    </tr>
                
            </table>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>

我的期望是 - 当我点击“保存”按钮时,模型,即 IEnumerable&lt;CheckedRentalProperty&gt; 项目,将被传递给控制器​​的 Save() 操作。但是,我发现传递的参数一直是“null”。我错过了什么?

【问题讨论】:

这个问题不是重复的。请阅读 Orel 的答案并查看差异 它是重复的。仔细阅读它,因为它还准确解释了为什么您的代码不起作用以及如何使用for 循环或EditorTemplate 解决它(并且Orel's 答案只是重复了重复的内容!)和奥雷尔的答案包含诸如 IEnumerable 不太友好 之类的废话,这是完全错误的,完全没有必要创建另一个视图模型来包装现有的视图模型 【参考方案1】:

完全是 IEnumerable 的模型不像 MVC 模型那么友好。

这里会出现很多问题,但简而言之,MVC 网络表单绑定需要以以下格式发送表单名称请求:PropertyName[Index].Property 在您的示例中情况并非如此。

创建一个包装 ViewModel 是一种很好的设计实践,它将包含给定控制器 + 页面所需的属性。

视图模型

public class RentalPropertiesViewModel

    public List<CheckedRentalProperty> CheckedRentalProperties  get; set; 

控制器:接下来我们要在控制器中使用这个 ViewModel。

public ActionResult Index()

    var checkHsList = new List<CheckedRentalProperty>();
    checkHsList.Add(new CheckedRentalProperty  Id = 1, Address = "Address1", IsSelected = true );
    checkHsList.Add(new CheckedRentalProperty  Id = 2, Address = "Address2", IsSelected = false );
    checkHsList.Add(new CheckedRentalProperty  Id = 3, Address = "Address3", IsSelected = true );

    var model = new RentalPropertiesViewModel
    
        CheckedRentalProperties = checkHsList
    ;
    return View(model);


[HttpPost]
public ActionResult Save(RentalPropertiesViewModel model)

    // why checkHsList is coming as null ??

    return null;

视图:现在在我们的视图中,我们应该将 Model 设置为我们创建的新 ViewModel 类型。

@model TestBindings.Models.RentalPropertiesViewModel

我们的视图形式应该是这样的:

<table class="table">
    <tr>
        <th>
            Is Selected
        </th>
        <th>
            Address
        </th>

    </tr>
    @for (int i = 0; i < Model.CheckedRentalProperties.Count(); i++)
    
        <tr>
            @Html.HiddenFor(model => model.CheckedRentalProperties[i].Id);
            <td>@Html.CheckBoxFor(model => model.CheckedRentalProperties[i].IsSelected)</td>

            <td>@Html.TextBoxFor(model => model.CheckedRentalProperties[i].Address)</td>
        </tr>
    
</table>

我使用了以下格式model =&gt; model.CheckedRentalProperties[i].IsSelected,现在 MVC InputExtensions 将正确绑定它。 例如: CheckedRentalProperties[0].IsSelected

重要提示:请注意,我将 Id 属性作为隐藏传递,因此 MVC Binder 会知道将 Id 设置为正确的项目。

【讨论】:

非常感谢,奥雷尔。它有效。

以上是关于为啥复选框选择列表总是在 ASP.NET MVC-5 中发布为 null [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥总是在 asp.net mvc 中同步异步操作(async await)

为啥在单步执行 ASP.NET MVC 控制器时,我的 VS2008 调试会话总是退出?

有没有办法将复选框列表绑定到 asp.net mvc 中的模型

使用 jquery 创建一个列表并将其发布到 asp.net mvc

如何将项目列表从视图传递到控制器(ASP.NET MVC 4)

如何在 ASP.NET MVC 中创建 CheckBoxListFor 扩展方法?