Чи повинні моделі ASP.NET MVC мати ідентифікатор?


11

Розробляючи додаток ASP.NET MVC, що дозволяє оновити модель, вам потрібен певний спосіб знати, як прийняти оновлену модель перегляду та співставити її з тією моделлю, яка зараз оновлена. Здається, є кілька різних способів зробити це, і мені цікаво, чи будь-який з них не є належним MVC (як, наприклад, дані зберігання даних вашого контролера, які повинні бути в моделі, не належні MVC)?

Усі моделі перегляду мають ідентифікаційний номер: плюси

  • Завжди переконайтеся, що ви можете відповідати вашій моделі.

Мінуси

  • Ви повинні бути дуже обережними, щоб жоден з ідентифікаторів не був змінений, ви можете мати користувачів, які оновлюють рядки, до яких вони не повинні мати доступу.

Лише моделі з мінімальним переглядом мають ідентифікатор: плюси

  • Набагато менше перевірки потрібно, щоб уникнути оновлення даних користувачів, до яких вони не мають доступу.

Мінуси

  • Набагато складніше відстежити, які моделі перегляду відповідають тій моделі.
  • Ви все ще повинні перевірити кілька моделей перегляду з ідентифікаторами, щоб переконатися, що користувач не оновлює дані, до яких не повинен мати доступ.

Жодна модель перегляду не має ідентифікатора:

Плюси

  • Не потрібно перевіряти ідентифікатори на наявність оновлень.

Мінуси

  • Ви повинні відмовитися від безгромадянства.

Тож у мене є два питання.

По-перше, чи є правильний / неправильний вибір? (Якщо ні, це означає, що вибір є питанням думки, а на моєму другому питанні, на основі думки, і його слід ігнорувати.)

По-друге, якщо є правильний / неправильний вибір, що це?

Щоб уточнити коментар, я говорю, коли у вас є модель перегляду, яка є імітацією об'єкта вашої бази даних.

Подумайте так:

public class InvoiceViewModel  //Does not have ID, does not relate to model.
{
    public CustomerViewModel CustomerVM { get; set; }  //Maybe has ID?  Does relate to model.
    public AddressViewModel BillingAddressVM { get; set; } //Ditto
    public AddressViewModel ShippingAddressVM { get; set; } //Ditto
    public List<InvoiceLineItemViewModel> ItemVMs { get; set; }  //Each one has an ID?
}

не це:

public class InvoiceViewModel
{
    public Customer Customer { get; set; }
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
    public List<InvoiceLineItem> Items { get; set; }
}

2
Що саме ви зробите з ідентифікатором ViewModel? Чи не мають у окремих ViewModel окремих ідентифікаторів?
Роберт Харві

Я, мабуть, повинен зазначити лише тоді, коли модель перегляду пов'язана з моделлю. Не всі моделі перегляду пов'язані між собою.
Lawtonfogle

You have to abandon statelessness.- Ви щойно зробили вибір використовувати MVC безглуздо.
Джоель Етертон

Чи є ідентифікатор, на який ви посилаєтесь тут основний ключ бази даних, або щось інше, що ви додаєте до ViewModel?
Верміс

@Vermis, я думаю, що первинним ключем бази даних буде простий ідентифікатор. Більш ретельним ідентифікатором буде будь-який фрагмент даних, що не змінюється, що дозволяє відновити відредагований об'єкт до ще не відредагованої збереженої версії, щоб змінити зміни можна було зберегти.
Lawtonfogle

Відповіді:


1

Об'єкт ViewModel, як правило, не є тим, що зберігається в таблиці бази даних. Це зберігаються окремі елементи об’єкта ViewModel. Кожен із цих елементів вже має ідентифікатор.

Наприклад:

public class InvoiceViewModel
{
    public Customer Customer { get; set; }
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
    public List<InvoiceLineItem> Items { get; set; }
}

Оскільки в базі даних немає жодної таблиці, яка відповідає InvoiceViewModel, для об’єкта InvoiceViewModel немає ідентифікатора.

Звичайно, Ви завжди можете використовувати InvoiceID як ідентифікатор для цього конкретного ViewModel. InvoiceID - це зручно, тому що саме цей об'єкт у кінцевому підсумку представляє. Але я міг бачити об’єкт ViewModel, який не відповідає якомусь конкретному ідентифікатору в базі даних.


1
Подумайте, де замість того, щоб використовувати фактичні моделі у моделі перегляду, InvoiceViewModel містить лише інші моделі перегляду (які стосуються моделей).
Lawtonfogle

-1

За замовчуванням у вас повинен бути ідентифікатор, навіть якщо ви його не використовуєте. Створіть стовпець у базі даних з іменем idта позначте auto incrementфункцію над ним, щоб ви були відсортовані.


1
Це прямо суперечить іншій відповіді, однак, не звертаючись до того, чому у вас все одно має бути ідентифікатор .
Мартійн Пітерс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.