Я создаю приложение ASP.NET MVC в сочетании с кодом EF6, который служит конфигуратором (как у автомобилей).
Рассмотрим в качестве примера следующие модели:
Office, Computer, Printer, Accessory
Это означает, что вы можете настроить one Office
, добавив несколько элементов: N Computer
, N Printer
и N Accessory
(т.е. коврики для мыши, наушники, ...)и, наконец, получаю общую стоимость офиса.
Каждая модель имеет свои свойства:
public class Office
{
public int OfficeID { get; set; }
public string Description { get; set; }
}
public class Computer
{
public int ComputerID { get; set; }
public Office MyOffice { get; set; }
public string Description { get; set; }
public decimal Cost { get; set; }
public int RamGigabytes { get; set; }
public int HardDriveGigabytes { get; set; }
}
public class Printer
{
public int PrinterID { get; set; }
public Office MyOffice { get; set; }
public string Description { get; set; }
public decimal Cost { get; set; }
public bool HasScanner { get; set; }
public string PaperSize { get; set; }
}
public class Accessory
{
public int AccessoryID { get; set; }
public Office MyOffice { get; set; }
public string Description { get; set; }
public decimal Cost { get; set; }
}
Чтобы справиться с этой ситуацией, я написал один контроллер Office
с тремяфункции Add, GetData, SaveData
для каждого Computer, Printer, Accessory
.Все они вызываются вызовами AJAX POST в View, возвращая строку JSON с некоторыми значениями (для упрощения я напишу только методы, относящиеся к классу Computer
).
public class OfficeController : Controller
{
[HttpPost]
public ActionResult AddComputer()
{
// Insert into database and return entity ID in a JSON string
}
[HttpPost]
public ActionResult GetComputerData(int ComputerID)
{
// Get data from DB and return it in a JSON string
}
[HttpPost]
public ActionResult SaveComputerData(int ComputerID, string NewData)
{
// Calculate the new cost, update DB, and return the updated price
}
}
Это решение означает:
- Наличие нескольких функций в контроллере, 9 в этом случае (3 x компонента)
- Необходимость создания N «подвидов» в представлении, 3 в этом случае (1 х компонент)
- Необходимость вручную создавать каждое отдельное поле в HTML-части представления, которое имеет свой собственный
id
, так что вы можете получить / назначить значение поля - Имея несколькофункции в JS-части представления (такие же, как в контроллере)
Итак, в случае, если вам необходимо добавить свойство к одной из трех моделей, вам необходимо:
- Изменение функций
Get
и Save
в контроллере - Изменение «подвида» модели, например, добавление
input
в контейнер div
- Изменить функции JS, чтобы получить / присвоить значение новому полю
Было бы много работы только для одного свойства, и я не думаю, что это хорошее решение, которое будет легко поддерживаться в будущем.
Есть ли лучшее решение?справиться с этой ситуацией?Что-то более динамичное, например, модель EAV (Entity-Attribute-Value)?