在 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
仅包含在视图上下文中很自然的简单类型。这样,我将视图中的逻辑呈现保持在最低限度,并保持视图干净。
您的视图模型可以非常简单地表示为:
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
。