【问题标题】:View not passing Ienumerable of Model查看不通过模型的 Ienumerable
【发布时间】:2013-09-23 17:39:42
【问题描述】:

编辑:移除部分视图以简化操作。现在我只需要找出为什么 The View 没有发布值

  • ViewModelProspectUsers

    public class ViewModelProspectUsers
    {
    
        public int Id { get; set; }
        public string User { get; set; }
        public IEnumerable<ViewModelProspectSelect> Prospects { get; set; }
    
    }
    
  • ViewModelProspectSelect

    public class ViewModelProspectSelect
    {
    
        public int ProspectID { get; set; }
        public string Name { get; set; }
        public bool IsSelected { get; set; }
    
    }
    
  • 查看

    @model OG.ModelView.ViewModelProspectUsers
    
    
    @using (Html.BeginForm())
    {
    
        @Html.HiddenFor(model => model.Id)
    
        <h5>Please Select Prospects you wish to assign to this User.</h5>
    

-----HERE 是以前的部分,这些值不会发布到[Post] 方法--------

------------------------------------------但是它们的填充效果很好------------------------------------------

        @foreach (var item in Model.Prospects)
        {
            @Html.HiddenFor(x => item.ProspectID)


                @Html.DisplayFor(x => item.Name)

                @Html.EditorFor(x => item.IsSelected)

        }

        @*@Html.Partial("_ShowProspectCheckedForUser", Model.Prospects)*@
        @*@Html.Partial("_ShowProspectCheckedForuser", new OG.ModelView.ViewModelProspectSelect())*@


    <input type="submit" value="Save changes" />
    @Html.ActionLink("Cancel", "Index")

}
  • 发帖

     [HttpPost]
     public ActionResult UsersInProspect(ViewModelProspectUsers viewModel)   
    

如果我要查看viewModel.Prospects(m=&gt;m.isSelected) //

我的视图模型变量显示数据,但不显示 Ienumerable。

【问题讨论】:

    标签: c# asp.net-mvc razor parameter-passing partial-views


    【解决方案1】:

    在处理列表类型的对象时,您必须使用数组表示法来引用它们,以便以模型绑定器可以解析它们的方式生成字段名称,即:

    for (var i = 0; i < Model.Count(); i++)
    {
        @Html.LabelFor(m => Model[i].SomeProperty)
        @Html.EditorFor(m => Model[i].SomeProperty)
    }
    

    在您的场景中,最好使用视图模型来包含您的列表并向项目添加 Selected 属性,以便您可以跟踪哪些项目被选中或未被选中。

    public class ViewModelProspects
    {
        public List<ViewModelProspectSelect> Prospects { get; set; }
    }
    
    public class ViewModelProspectSelect
    {
        // Whatever else you have
    
        public bool Selected { get; set; }
    }
    

    那么,在你看来:

    @model ViewModelProspects
    
    @using (Html.BeginForm())
    {
        for (var i = 0; i < Model.Prospects.Count(); i++)
        {
            <label>
                @Html.HiddenFor(m => Model.Prospects[i].Id)
                @Html.CheckboxFor(m => Model.Prospects[i].Selected, true)
                @Model.Prospects[i].Name
            </label>
        }
    }
    

    最后,更改您的操作方法签名:

    [HttpPost]
    public ActionResult UsersInProspect(ViewModelProspects model)
    

    然后,您可以通过以下方式轻松获取操作中选定 id 的列表:

    var selectedIds = model.Prospects.Where(m => m.Selected).Select(m => m.Id)
    

    【讨论】:

    • 我更改了我的模型以包含您的答案,它们列出的很好(但未选中)但不知何故 Object reference not set to an instance of an object. 出现在 @Model.Prospects[i].Name 想法的行上? - 将测试返回
    • Name 只是我制作的一个属性,用于表示包含您希望在复选框旁边显示的文本的属性。
    • 太棒了,对不起,我花了一段时间才明白你在做什么。还有没有办法用 Ienumerables 做到这一点?你必须做清单吗?
    • 不,它必须是一个列表。您必须使用标准的 for 循环(而不是 foreach)来让 Razor 正确生成字段名称,这意味着您需要指定循环的结束,这需要计数。使用 IEnumerable 会用完您的枚举,然后您实际上无法运行循环。
    猜你喜欢
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    相关资源
    最近更新 更多