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.

Другие вопросы по тегам