1

基本上我想要一个包含Owner详细信息的视图。Owner可以有多种类型的Vehicle 或没有),可以使用 Checkbox 进行选择:

索引视图

提交时,必须更新数据库,因为下次在视图中显示所有者时,所有者必须选中正确的复选框。

我不确定如何构建我的 EF 模型,也不确定我是否正确链接它以获得我想要的结果。

我不想将车辆类型作为字段硬编码到Owner对象中,因为有大量车辆。

谁能指出我如何链接这些模型的正确方向?我需要数据库中的两个或三个表吗?

这是我目前所拥有的,但它可能是错误的。如果您有任何想法,请立即停止阅读以避免混淆。 欢迎任何意见!

型号:

public class Vehicle
{
    public int VehicleID { get; set; }
    public string Name { get; set; }
}

public class Owner
{
    public int OwnerID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<OwnerVehicle> OwnerVehicles { get; set; }
}

public class OwnerVehicle
{
  public int OwnerVehicleID { get; set; }

  public bool Ticked { get; set; }
  //Not sure if this is needed, because ticked will always be true
  //I delete OwnerVehicle if not needed

  public int OwnerID { get; set; }
  public virtual Owner Owner { get; set; }

  public int VehicleID { get; set; }
  public virtual Vehicle  Vehicle { get; set; }
}

控制器 :

public ActionResult Index()
    {
        //prepopulate Owner objects on the fly for this example, in my project it would fetched/created with EF into database
        Owner owner = getOwner();
        return View(owner); // we return the owner to view
    }

    public Owner getOwner()
    {
        //Create a owner
        Owner owner = new Owner() { OwnerID = 1, Name = "JACK" };

        //Create a list of vehicles
        List<Vehicle> Vehicles = new List<Vehicle>();
        Vehicles.Add(new Vehicle() { VehicleID = 1, Name = "I have a car"});
        Vehicles.Add(new Vehicle() {VehicleID = 1, Name = "I have a bike" });

        //the owner doesnt have any vehicles yet, therefor object OwnerVehicle is null at the moment

        return owner;
    }

    [HttpPost]
    public ActionResult Index(Owner owner)
    {   
        //at this point, the owner needs have his list of Vehicles linked, and written to database
        //
        //ToDO
        //return View();
    }

下面的视图不会编译,因为我迷路了。
索引.cshtml

    @model Owner
    @using (Html.BeginForm())
    {
          <div class="editor-field">
                @Html.EditorFor(model => model.OwnerVehicles)
            </div>
    }

EditorTemplates/OwnerVehicles.cshtml

    @model OwnerVehicle
    <div>
        @Html.CheckBoxFor(x => x.Ticked)
        @Html.LabelFor(x => x.TODO, Model.TODO)
        @Html.HiddenFor(x => x.TODO)
    </div>
4

2 回答 2

2

我将创建一个对象,以帮助呈现您尝试输出的内容。它将在“模型”中,但不会以任何方式映射到数据库。它看起来像这样:

public class VehicleHelper //or whatever you would like to call it...
{
  public Vehicle Vehicle { get; set; }
  public bool Ticked { get; set; }
}

然后你Owner会有一个这样的列表VehicleHelpers

public class Owner
{
  //include the properties you listed here...

  [NotMapped]
  public IEnumerable<VehicleHelper> VehicleHelpers { get; set; }
}

然后控制器将根据需要填充VehicleHelpers属性:

public ActionResult Edit(int id)
{
  MyContext db = new MyContext();
  Owner owner = db.Owners.FirstOrDefault(o => o.OwnerID == id);
  if (owner == null) thrown new Exception("Invalid Owner ID");
  owner.VehicleHelpers = db.Vehicles
    .Select(v => new VehicleHelper() { Vehicle = v, Ticket = false });
  foreach (Vehicle ownedVehicle in owner.OwnerVehicles.Select(ov => ov.Vehicle))
  {
    VehicleHelper helper = owner.VehicleHelpers
      .FirstOrDefault(vh => vh.Vehicle == ownedVehicle);
    if (helper == null) continue;
    helper.Ticked = true;
  }
  return View(owner);
}

[注意:以下部分是我不确定确切语法、约定等的地方,因为我自己只是在学习 MVC 和 Razer,但应该很接近。随意编辑或建议编辑。;)]

然后你会有一个 的编辑器模板,VehicleHelper看起来像这样:

@model VehicleHelper
<div>
  @Html.CheckBoxFor(vh => vh.Ticked)
  @model.Vehicle.Name
  @Html.HiddenFor(vh => vh.Vehicle.VehicleID)
</div>

我希望至少可以帮助您指出正确的方向。;)

于 2013-07-05T17:08:42.480 回答
0

CptRobby 帮助我更深入地抓取网络,并发现我的问题与此问题重复

Ciaran Bruen 创建了一个很棒的教程,可以在这里找到,页面左侧有一个可下载的解决方案。

它展示了如何创建多对多关系、复选框和更新数据库。

于 2013-07-24T12:21:22.107 回答