EF и CheckboxFor

Вопрос:

В основном я хочу представление, которое содержит сведения о владельце. Владелец может иметь несколько типов транспортных средств (или их нет), которые могут быть выбраны с помощью флажка:

The Index View

При отправке база данных должна быть обновлена, так как в следующий раз, когда Владелец отобразится в представлении, у Владельца должны быть установлены правильные флажки.

Я не уверен, как структурировать мои модели 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();
}

Вид ниже не компилируется, потому что я потерян.
Index.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>

Лучший ответ:

CptRobby помог мне глубже проникнуть в сеть, и наш вопрос стал дубликатом этого

Ciaran Bruen создал отличный учебник, который можно найти здесь, и есть загружаемое решение слева от страницы.

В нем показано, как создавать отношения «многие-многие», флажок и обновление базы данных.

Ответ №1

Я бы создал объект, который поможет в представлении того, что вы пытаетесь вывести. Он был бы в «модели», но не был бы привязан к базе данных каким-либо образом. Это будет выглядеть примерно так:

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 свойство 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>

Я надеюсь, что, по крайней мере, поможет вам в правильном направлении. 😉

Оцените статью
TechArks.Ru
Добавить комментарий