В ASP.NET MVC должны ли модели представления иметь идентификатор?

11

При разработке приложения ASP.NET MVC, которое позволяет обновлять модель, вам нужно каким-то образом узнать, как взять обновленную модель представления и сопоставить ее с моделью, которая теперь обновлена. Кажется, есть несколько разных способов сделать это, и мне интересно, если какой-либо из них не является правильным MVC (очень похоже на то, что ваш контроллер хранит данные, которые должны быть в модели, не является правильным MVC)?

Все модели просмотра имеют ID: Плюсы

  • Всегда убедитесь, что вы можете соответствовать своей модели.

Cons

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

Идентификатор имеют только модели с минимальным обзором: Плюсы

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

Cons

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

Нет моделей с идентификатором:

Pros

  • Нет необходимости проверять идентификаторы на наличие обновлений.

Cons

  • Вы должны отказаться от безгражданства.

Итак, у меня есть два вопроса.

Во-первых, есть ли правильный / неправильный выбор? (Если нет, это означает, что выбор - это вопрос мнения, а мой второй вопрос основан на мнении и должен игнорироваться.)

Во-вторых, если есть правильный / неправильный выбор, что это?

Чтобы пояснить комментарий, я говорю, когда у вас есть модель представления, которая имитирует объект вашей базы данных.

Подумай так:

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; }
}
Lawtonfogle
источник
2
Что именно вы будете делать с идентификатором ViewModel? Разве отдельные объекты в ViewModel не имеют собственных идентификаторов?
Роберт Харви
Я должен, вероятно, указать только когда модель представления связана с моделью. Не все модели представлений связаны между собой.
Lawtonfogle
You have to abandon statelessness.- Вы только что сделали выбор использовать MVC бессмысленно.
Джоэл Этертон,
Идентификатор, на который вы ссылаетесь, является первичным ключом базы данных, или что-то еще, что вы добавляете в ViewModel?
Vermis
@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

По умолчанию у вас должен быть идентификатор, даже если вы его не используете. Создайте столбец в базе данных с именем as idи отметьте auto incrementего, чтобы отсортировать.

Акаша
источник
1
Это прямо противоречит другому ответу, не затрагивая, почему вы все равно должны иметь идентификатор .
Мартейн Питерс