我找不到这样的问题的解决方案。如果这是重复的帖子,我很抱歉。
我正在为此建模我的解决方案
我的 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 列表。
似乎工作正常。