在 ViewModel、ASP.net MVC 中定义“模型”类型的属性是否好

本文关键字:类型 模型 属性 是否 定义 ViewModel ASP net MVC | 更新日期: 2023-09-27 18:20:36

我已经阅读了几篇关于在MVC中使用ViewModel的文章 ASP.net 并意识到它与M-V-VM模式中的"ViewModel"不同。

使用视图模型

是为了避免直接从视图访问模型,但是在视图模型中具有类型属性(在模型层定义(是好方法吗?这意味着最终我们需要将模型命名空间包含在 ViewModel 中。

例如


1. 是否待定实体/POCO类

public partial class YesNoTBDValue
{
    public int Id { get; set; }
    public string Name { get; set; }
}

2 否TBDValue 在项目实体中使用的类(在模型本身中定义(

public partial class Project
{
     public virtual YesNoTBDValue IsAvailable { get; set; }
}

查看模型
1. 项目编辑视图模型

public class ProjectEditViewModel
{
HERE TO INCLUDE YesNoTBDValue CLASS, I NEED TO INCLUDE MODELS 
OR THERE IS BETTER WAY?
    public List<YesNoTBDValue> YesNoTBDValues { get; set; }
    public int IsAvailableSelectedItemId { get; set; }
}

控制器
项目控制器(在创建视图模型的新实例的编辑操作中(

ProjectEditViewModel projectEditViewModel = new ProjectEditViewModel
{
    YesNoTBDValues = db.YesNoTBDValues.ToList()
};

视图
从 YesNoTBDValues 列表中显示下拉列表,并将所选项目保留在 IsAvailableSelectedItemId 中

@Html.DropDownList("IsAvailableSelectedItemId ", 
new SelectList(Model.YesNoTBDValues, "Id", "Name",
            Model.IsAvailableSelectedItemId ))

请建议我应该如何正确编码。

重复问题:视图模型是否应该包含模型的命名空间?在我的示例中,YesNoTBDValue 是在模型中定义的,为了使用它,我正在使用模型的命名空间

/

另一种方法/

对我现有的方法不满意,我从github下载了Microsoft Nuget Gallery源代码,并意识到他们从未在VIEWMODEL中使用过MODELS,这对我来说很有意义。我对上面的代码进行了一些更改(以便从 ViewModel 中删除对模型的引用(,发现它工作得很好。

以下是我的更改:

模型没有变化,原样

查看模型
1. 创建 YesNoTBDValue 类的副本 说 YesNoTBDValueViewModel

public class YesNoTBDValueViewModel
{
   public int Id { get; set; }
   public string Name { get; set; }
}

2 在项目编辑视图模型中使用此视图模型并删除模型引用

public class ProjectEditViewModel
{
     public List<YesNoTBDValueViewModel> YesNoTBDValues {get;set;}
     public int IsAvailableSelectedItem {get;set;}
}

控制器 更改填充这些值的方式。(在"编辑"操作中(

ProjectEditViewModel projectEditViewModel = new ProjectEditViewModel
{
    YesNoTBDValues = db.YesNoTBDValues.Select(
                x => new LMSPriorTool.ViewModels.YesNoTBDValueVM
 {
    Id = x.Id,
    Name = x.Name
 }).ToList()
}

发现在这些更改之后,它也可以正常工作。我喜欢第二种方法,因为在此模型中,模型和视图模型彼此完全分离。保持这个问题有待进一步讨论。

如果我在这里遗漏了什么,请提供一些光芒。

在 ViewModel、ASP.net MVC 中定义“模型”类型的属性是否好

我尝试使ViewModel仅包含在视图上下文中很自然的简单类型。这样,我将视图中的逻辑呈现保持在最低限度,并保持视图干净。

您的视图模型可以非常简单地表示为:

public class ProjectEditViewModel
{
    public int YesNoTBDValueSelected { get; set; }
    public SelectList YesNoTBDValueOptions { get; set; }
}

public class ProjectEditViewModel
{
    public int YesNoTBDValueSelected { get; set; }
    public IEnumerable<SelectListItem> YesNoTBDValueOptions { get; set; }
}

现在,用于生成SelectList的逻辑进入您的Project <> ProjectEditViewModel映射中,并且不View