我已经阅读了几篇关于在ASP.net MVC中使用ViewModel的帖子,并意识到它与M-V-VM模式中的“ViewModel”不同。
使用ViewModel是为了避免直接从View 访问Model,但是在ViewModel中获得类型属性(在Model层定义)是一种很好的方法吗?这意味着最终我们需要将模型命名空间包含在ViewModel中。
E.g。
模型
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列表中的DropDownList并在IsAvailableSelectedItemId中保留所选项目
@Html.DropDownList("IsAvailableSelectedItemId ",
new SelectList(Model.YesNoTBDValues, "Id", "Name",
Model.IsAvailableSelectedItemId ))
请建议我如何正确编码。
重复问题:ViewModel是否应该包含Model的命名空间?在我的示例中, YesNoTBDValue 在模型中定义并使用它我正在使用模型的命名空间
/ 另一种方法 /
对我现有的方法不满意,我从github下载了Microsoft Nuget Gallery源代码并意识到他们从未在VIEWMODEL中使用过MODELS ,这对我来说很有意义。我稍微更改了上面的代码(以便从ViewModel 中删除Model的引用)并且发现它运行良好。
以下是我的更改:
模型 无变化,与之相同
查看模型
1.创建YesNoTBDValue类的副本说明 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()
}
在这些变化之后发现它也很好。我喜欢第二种方法,因为模型和ViewModel完全相互分离。保持这个问题可供进一步讨论。
如果我在这里遗漏了什么,请点亮一下。
答案 0 :(得分:1)
我尝试让ViewModel
只包含在视图上下文中很自然的简单类型。这样我就可以将视图中的逻辑渲染到最小,并保持视图清洁。
您可以使用以下内容非常简单地表示您的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
&lt; - &gt; ProjectEditViewModel
映射,并且不在View
之内。