C# ASP.NETMVC-正确执行MVVM

C# ASP.NETMVC-正确执行MVVM,c#,asp.net-mvc,asp.net-mvc-viewmodel,C#,Asp.net Mvc,Asp.net Mvc Viewmodel,我只是有一个关于MVVM设计模式的快速问题。。。我只是想知道我做事的方式是否“正确” 我有这样的分类模式: [Table("Category")] public class CategoryModel { [Key] public Int32 CategoryId { get; set; } public string CategoryName { get; set; } public Int32? Category_ParentID { get; set; }

我只是有一个关于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作为parement发送,并使用ViewModel中的值创建新的CategoryModel,如下所示:

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—并写入DB)?还是我误解了该怎么做

同时


“查看”部分是如何工作的?我的意思是,如果我在控制器的Index()方法中列出一个类别及其所有子类别。。。我应该使用模型还是视图模型来显示它们?当然,我需要将ICollection添加到ViewModel中,然后我应该使用Entity Framework和Model类获取数据,然后以某种方式将其输入到ViewModel中吗?

是的,这是正确的。但是我会使用automapper之类的工具来减少您需要编写的实际映射代码

您将使用viewmodel来显示项目,并且它将从您的模型映射(使用automapper再次变得更容易)

您还可以将DataAnnotation放置在viewmodel上,这将有助于视图上的验证逻辑


但是,在进行MVC时,不需要使用MVVM。它们是碰巧能够一起工作的不同模式。MVVM在WPF应用程序开发中更常用。

您的建议是正确的,但我还有一些其他建议供您参考:

  • 不要使用模型后缀命名实体框架实体,请使用 数据库表的单数形式名称
  • 始终返回一个对象。如果要返回对象列表,请将此列表包装到类中。它将帮助您保持ViewModels更灵活、更易于扩展。使用包装器类 如果要返回单个值,也可以使用。我称这些对象为页面模型
如果我想返回单个类别,则我的编辑页面模型如下所示:

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。

+1使用视图模型渲染并仅发布所需的属性。当检查
ModelState
是否有效时,您可能希望返回视图,以便用户可以更正任何验证错误,而不是抛出错误,并且不确定
返回PartialView的是什么(“\u CategoryModelItem”,model)是吗?-您不想重定向到索引页吗?在MVC应用程序中仅使用ViewModels不是MVVM。MVVM基于可观察和IPropertyNotification的概念。它广泛用于Silverlight/WPF和使用剑道、击倒或角度的web开发。
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; }
}