2

我找不到这样的问题的解决方案。如果这是重复的帖子,我很抱歉。

我正在为此建模我的解决方案

MVC3 - 具有复杂类型列表的视图模型

我的 ViewModel (ZooAnimalsViewModel) 包含可能的动物列表以及 ICollection。

我正在尝试填充 Zoo 和 Animal 之间的链接表 - 该表是 ZooAnimalDetail。我将 ZooAnimalsViewModel 作为模型传递给主视图,将 Animal 作为模型传递给 EditorTemplate 文件 allAnimals.cshtml。

从我所见,我应该使用框架通过在 EditorTemplate 目录中创建一个与我要显示的列表/集合同名的文件来生成列表。

我想显示列表 allAnimals 并使用它来更新 ICollection ZooAnimalDetail 中包含的内容 - 我不知道如何编写一个 Html 助手来绑定它们。

简化的 ViewModel ZooAnimalViewModel 具有以下属性:

public class ZooAnimalViewModel
    {
        public Zoo zoo { get; set; }
        public ICollection<ZooAnimalDetail> ZooAnimalDetail { get; set; }
        public List<Animal> allAnimals { get; set; }
    }

ZooAnimalDetail 的简化模型如下:

  public partial class ZooAnimalDetail
      {
          public int zooID { get; set; }
          public int animalID { get; set; }
          public bool animalDefault { get; set; }
          public virtual Animal Animal { get; set; }
          public virtual Zoo Zoo { get; set; }
      }

Animal的简化模型如下:

public partial class Animal
{
   public Animal()
   {
       ZooAnimalDetails = new HashSet<ZooAnimalDetail>();
   }
   public int animalID { get; set; }
   public string animalName { get; set; }
   public virtual ICollection<ZooAnimalDetail> ZooAnimalDetails { get; set; }
}

在控制器中,我创建了一个新的 ZooAnimalViewModel 对象,并将 zoo 初始化为当前动物园和 allAnimals 以包含所有可能生活在该动物园的动物的列表。

在我看来,我试图用 2 个复选框显示 allAnimals 列表中的所有项目。如果选中复选框 1,则将此动物添加到动物园。如果选中复选框 2,则 AnimalDefault 设置为 true。

简化视图如下所示

@model ZooAnimalViewModel
@using (Html.BeginForm())
{
    @Html.HiddenFor(x => Model.zoo.zooID)
    <table>
        <tr>
            <th>Animal Name</th>
            <th>Add</th>
            <th>Set as default</th>
        </tr>
        @Html.EditorFor(x => x.allAnimals)
    </table>
    <input type="submit" value="Save" />
}

在 ~/Views/Shared/EditorTemplates/allAnimals.cshtml 我试图设置视图

@model DatabaseName.Models.Animal
@Html.HiddenFor(x => x.animalID)
<tr>
    <td>@Html.CheckBoxFor(x => x.ZooAnimalDetail.??)</td>  @*PROBLEM 1*@
    <td>@Html.CheckBoxFor(x => x.ZooAnimalDetail.Add(animalDefault))</td> @*PROBLEM 2*@
    <td>@Html.DisplayFor(x => x.animalName)</td>
</tr>

问题 1 - 我想为列表中的每个动物显示一个复选框 - 如果选中,我希望将此动物添加到动物园中 - 因此此 zooID 和 animalID 的 ZooAnimalDetail 将存在。

问题 2 - 如果选择将动物添加到动物园并选中第二个复选框,我想将 ZooAnimalDetail 中的 animalDefault 设置为 true。

我以正确的方式接近这个吗?

编辑

向前进

我将布尔字段 IsChecked 添加到 ZooAnimalDetail 类

我创建了 ~/Views/Shared/EditorTemplates/ZooAnimalDetail.cshtml 如下

  @model DatabaseName.Models.ZooAnimalDetail
  @Html.HiddenFor(x => x.animalID)
  <tr>
      <td>@Html.CheckBoxFor(x => x.IsChecked)</td>
      <td>@Html.CheckBoxFor(x => x.animalDefault)</td>
      <td>@Html.DisplayFor(x => x.Animal.animalName)</td>
  </tr>

而不是使用

@Html.EditorFor(x => x.allAnimals) 在视图中

我用

@Html.EditorFor(x => x.ZooAnimalDetail)

在将 ZooAnimalViewModel (zavm) 传递回 Post Controller 后,我将其保存到数据库中,以便生成 zooID。

我使用 foreach 循环仅选择那些 IsChecked 设置为 true 的动物来更新 ZooAnimalDetail 实体。

     if (ModelState.IsValid)
       {
           db.Zoos.Add(zavm.zoo);
           db.SaveChanges();

           //grab the new zooID
           int lastzooID = db.Zoos.Max(item => item.zooID);

           foreach (ZooAnimalDetail z in zavm.ZooAnimalDetail)
           {
               if (z.IsChecked == true)
               {
                    z.zooID = lastzooID;
                    db.ZooAnimalDetails.Add(z);
               }
           }                
            db.SaveChanges();
            return RedirectToAction("Index");
       }

我不再需要 ZooAnimalViewModel 中的 allAnimals 列表。

似乎工作正常。

4

0 回答 0