ASP.NET MVC - обработка нескольких моделей в одном представлении - PullRequest
0 голосов
/ 28 сентября 2019

Я создаю приложение 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
    }
}

Это решение означает:

  1. Наличие нескольких функций в контроллере, 9 в этом случае (3 x компонента)
  2. Необходимость создания N «подвидов» в представлении, 3 в этом случае (1 х компонент)
  3. Необходимость вручную создавать каждое отдельное поле в HTML-части представления, которое имеет свой собственный id, так что вы можете получить / назначить значение поля
  4. Имея несколькофункции в JS-части представления (такие же, как в контроллере)

Итак, в случае, если вам необходимо добавить свойство к одной из трех моделей, вам необходимо:

  1. Изменение функций Get и Save в контроллере
  2. Изменение «подвида» модели, например, добавление input в контейнер div
  3. Изменить функции JS, чтобы получить / присвоить значение новому полю

Было бы много работы только для одного свойства, и я не думаю, что это хорошее решение, которое будет легко поддерживаться в будущем.

Есть ли лучшее решение?справиться с этой ситуацией?Что-то более динамичное, например, модель EAV (Entity-Attribute-Value)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...