ASP.Net MVC - делает MVVM правильно
У меня просто быстрый вопрос относительно шаблона проектирования MVVM... Мне просто интересно, является ли способ, которым я делаю вещи, "правильным" способом?
У меня есть режим категории, например, так:
[Table("Category")]
public class CategoryModel
{
[Key]
public Int32 CategoryId { get; set; }
public string CategoryName { get; set; }
public Int32? Category_ParentID { get; set; }
public virtual CategoryModel Parent_Category { get; set; }
public virtual ICollection<CategoryModel> SubCategories { get; set; }
public Int16 CategoryOrder { get; set; }
public bool Deleted { get; set; }
}
Не все из них нужны в форме "Создать новую категорию", поэтому я создал ViewModel только с обязательными полями:
public class CategoryViewModel
{
public string CategoryName { get; set; }
public Int32? Category_ParentID { get; set; }
}
Когда создается новая категория, я отправляю ViewModel как часть и создаю новую CategoryModel, используя значения из ViewModel, например, так:
if (ModelState.IsValid)
{
CategoryModel newCategory = new CategoryModel()
{
CategoryName = model.CategoryName,
Category_ParentID = model.Category_ParentID
};
//get the root node, and include it's subcategories
var categoryList = DatabaseContext.Categories.Include("SubCategories").Single(c => c.CategoryId == model.Category_ParentID);
//set the order of the category by getting the number of subcategories
if (categoryList.SubCategories.Count > 0)
newCategory.CategoryOrder = (Int16)(categoryList.SubCategories.Where(c => !c.Deleted).Max(c => c.CategoryOrder) + 1);
else
newCategory.CategoryOrder = 1;
//save the new category
DatabaseContext.Categories.Add(newCategory);
await DatabaseContext.SaveChangesAsync();
return PartialView("_CategoryModelItem", model);
} else {
return new HttpStatusCodeResult(HttpStatusCode.InternalServerError);
}
Является ли это правильным способом создания шаблона проектирования MVVM (то есть значения берутся из ViewModel, создается новая модель - принимает значения из ViewModel - и записывается в БД)? или я неправильно понимаю, как это сделать?
Также
Как работает "просмотр"? Что я имею в виду, если я перечисляю категорию и все ее подкатегории в методе Index() контроллера... должен ли я использовать модель или модель представления для их отображения? Поэтому мне нужно добавить необходимость добавить ICollection в ViewModel, а затем я должен получить данные, используя Entity Framework и класс Model, и затем каким-то образом передать их в ViewModel?
2 ответа
Вы правы, но у меня есть несколько советов для вас:
- не называйте сущности Entity Framework с постфиксом Model, используйте имена таблиц БД в единственном числе
- всегда возвращать объект. Если вы хотите вернуть список объектов, оберните этот список в класс. Это поможет вам сделать ваши ViewModels более гибкими и легко расширяемыми. Используйте класс-оболочку также, если вы хотите вернуть одно значение. Я называю эти объекты PageModels.
Если я хочу вернуть одну категорию, то моя модель страницы редактирования будет выглядеть так:
public class CategoryEditPageModel
{
CategoryModel Category { get; set;}
//other data not directly related to category itself but needs to be visible on the page
User CategoryOwner { get; set; }
}
Затем разместите только CategoryModel, если вы хотите обновить категорию.
Да, это правильно. Но я бы использовал что-то вроде autopper, чтобы уменьшить реальный код отображения, который вам нужно написать.
Вы будете использовать модель представления для отображения элементов, и она будет отображена в вашей модели (опять же, с помощью Autopper).
Вы также поместите свои аннотации данных в модель представления, и это поможет с логикой проверки в вашем представлении.
Тем не менее, вам не нужно использовать MVVM, когда вы делаете MVC. Это разные модели, которые могут работать вместе. MVVM чаще используется при разработке приложений WPF.