我已经阅读了几篇关于在 ASP.net MVC 中使用 ViewModel 的文章,并意识到它与 MV-VM 模式中的“ViewModel”不同。
使用 ViewModel 是为了避免直接从 View 访问模型,但是在 ViewModel 中具有类型属性(在模型层定义)是一种好方法吗?这意味着最终我们需要将Model 命名空间包含到 ViewModel 中。
例如
模型
1. YesNoTBDValue 实体/POCO 类
public partial class YesNoTBDValue
{
public int Id { get; set; }
public string Name { get; set; }
}
2项目实体中使用的 YesNoTBDValue 类(在模型本身中定义)
public partial class Project
{
public virtual YesNoTBDValue IsAvailable { get; set; }
}
查看模型
1. ProjectEditViewModel
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 列表中的 Showing DropDownList 并将所选项目保留在 IsAvailableSelectedItemId
@Html.DropDownList("IsAvailableSelectedItemId ",
new SelectList(Model.YesNoTBDValues, "Id", "Name",
Model.IsAvailableSelectedItemId ))
请建议我如何正确编码。
重复问题:ViewModel 是否应该包含 Model 的命名空间?在我的示例中 YesNoTBDValue是在模型中定义的,要使用它,我正在使用模型的命名空间
/另一种方法/
对我现有的方法不满意,我从 github 下载了 Microsoft Nuget Gallery 源代码,并意识到他们从未在 VIEWMODEL中使用过模型,这对我来说很有意义。我稍微更改了上面的代码(为了从 ViewModel 中删除 Model 的引用),发现它工作得很好。
这是我的更改:
型号 无变化,原样
View Model
1. 创建 YesNoTBDValue 类的 Replica 说YesNoTBDValueViewModel
public class YesNoTBDValueViewModel
{
public int Id { get; set; }
public string Name { get; set; }
}
2 在ProjectEditViewModel中使用此 ViewModel并删除模型引用
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()
}
并在这些更改之后发现,它也可以正常工作。我喜欢第二种方法,因为在这个模型和视图模型中是完全分开的。保持这个问题开放以供进一步讨论。
如果我在这里遗漏了一些东西,请给我一些启发。