为什么带有数组索引前缀的Html.TextBox无法读取构造为集合的模型数据



我有两个模型类;技能和技能级别,每个技能可以有许多技能级别:

public partial class Skill
    {
        public Skill()
        {
            this.SkillLevels = new HashSet<SkillLevel>();
            this.SkillLevelStaffs = new HashSet<SkillLevelStaff>();
            this.SkillVersionHistories = new HashSet<SkillVersionHistory>();
            this.Customers = new HashSet<Customer>();
            this.LinkToKBs = new HashSet<LinkToKB>();
        }
        public int SkillID { get; set; }
        public string Name { get; set; }
        public bool IsAllCustomer { get; set; }
        public string Description { get; set; }
       //code goes here

        public virtual ICollection<SkillLevel> SkillLevels { get; set; }
    }
public partial class SkillLevel
    {
        public int SkillID { get; set; }
        public int LevelID { get; set; }
        public string Description { get; set; }
        public string TestProcess { get; set; }
        public virtual Level Level { get; set; }
        public virtual Skill Skill { get; set; }
    }

现在在技能创建/编辑视图中,我显示四对技能级别字段

@for (var i = 0; i < 4; i++)
       {
<div class="form-group">
@Html.Label("SkillLevels[" + i.ToString() + "].TestProcess", new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextArea("SkillLevels[" + i.ToString() + "].TestProcess",new { @class = "form-control", rows=10}) 
</div>
@Html.Label("SkillLevels[" + i.ToString() + "].Description", new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextArea("SkillLevels[" + i.ToString() + "].Description") 
@Html.ValidationMessage("SkillLevels[" + i.ToString() + "].Description",new { @class = "form-control", rows=10})
</div></div>
string v = (i + 1).ToString();
@Html.Hidden("SkillLevels[" + i.ToString() + "].SkillID",Model.SkillID)
@Html.Hidden("SkillLevels[" + i.ToString() + "].LevelID", v)
       }

这将在创建视图中很好地工作,其中将显示四对文本过程+描述并作为collection<SkillLevels>回发,但是如果我在编辑视图中有相同的代码,那么当我访问编辑viw时,四对SkillLevel将始终为空,似乎带有索引数组的文本框无法读取Collection<SkillLevels>? 所以在编辑视图中,我必须定义一个foreach以获得这项工作:-

@{
int i=0;
}
@foreach(var s in Model.SkillLevels)
{
  <div>
    @Html.Editor("SkillLevels[" + i.ToString() + "].TestProcess", new { @Value = s.TestProcess }) 

但我正在尝试对编辑 + 创建使用相同的视图。 任何人都可以 阿迪夫斯 ?

你不应该使用魔术字符串。我按以下方式做同样的事情:

@for (var i = 0; i < Model.SkillLevels.Length; i++)
{
    <div class="form-group">
    @Html.LabelFor(m => m.SkillLevels[i].TestProcess, new { @class = "control-label col-md-2" })
    <div class="col-md-10">
    @Html.TextAreaFor(m => m.SkillLevels[i].TestProcess, new { @class = "form-control", rows=10}) 
    </div>
    ...
}

如果是新项目,您需要用 4 个空项目"预填充"集合......

如果使用foreach迭代集合,则模型绑定不起作用,因此使用 form.SkillLevels[i]

如果您可以使用迭代 SkillLevels 集合的每个循环制作编辑视图,并希望使用相同的视图继续创建 - 我的第一个想法是简单地将四个空元素添加到返回创建视图模型的操作方法中的集合中。

为此,您应该在模型中提供可为空的变量

public partial class SkillLevel
    {
        public int? SkillID { get; set; }
        public int? LevelID { get; set; }
        public string Description { get; set; }
        public string TestProcess { get; set; }
        public virtual Level Level { get; set; }
        public virtual Skill Skill { get; set; }
    }

最后两个我认为无关紧要。

然后在您的控制器中,它应该或多或少看起来像这样:

public ActionResult Create()
{
   var model = new SomeModel();
   model.SkillLevels = new List<SkillLevel>(4);
   for(int i=0;i<4;i++)
   {
      model.SkillLevels.Add(new SkillLevel());
   }
   return View("~/sth/Edit", model); //here should be path to your view
}

最新更新