2014-09-16 3 views
2

У меня есть быстрый вопрос относительно шаблона проектирования MVVM ... Мне просто интересно, способ, которым я занимаюсь, - это «правильный» способ?ASP.Net MVC - правильное выполнение 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 как parement, и создать новый 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?

+0

+1 с точки зрения использования модели представления для рендеринга и публикации только тех свойств, которые вам нужны.При проверке правильности «ModelState» вы, вероятно, захотите вернуть представление, чтобы пользователь мог исправить любую ошибку проверки, вместо того чтобы бросать ошибку и не уверен, что «возвращает PartialView (« _ CategoryModelItem », model);' is? - Не переадресовываете ли вы на индексную страницу? –

+0

Просто использование ViewModels в приложении MVC не является MVVM. MVVM основан на концепции наблюдаемой и IPropertyNotification. Он широко используется в Silverlight/WPF и в веб-разработке с использованием кендо, нокаутом или угловым. – Fran

ответ

0

Вы правильно, но у меня есть некоторые другие советы для вас:

  • не называют Entity Framework объектов с Типовым постфиксом, используйте имена таблиц БД в единственном числе
  • всегда возвращают объект , Если вы хотите вернуть список объектов, оберните этот список в класс. Это поможет вам более гибко и легко расширять ваши 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; } 
} 

Тогда POST только CategoryModel, если вы хотите обновить категорию.

0

Да, это правильно. Но я бы использовал что-то вроде automapper, чтобы уменьшить фактический код отображения, который вам нужно написать.

Вы будете использовать viewmodel для отображения элементов, и он будет отображен из вашей модели (снова упрощен с помощью automapper).

Вы также разместите свои данные на моделях viewmodel, и это поможет с логикой проверки на вашем представлении.

Однако вы не должны использовать MVVM, когда выполняете MVC. Это разные модели, которые могут работать вместе. MVVM чаще используется в разработке приложений WPF.

Смежные вопросы