在ViewModel,ASP.net MVC中定义“Model”类型的属性是否合适?

时间:2013-06-29 20:10:55

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-viewmodel

我已经阅读了几篇关于在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完全相互分离。保持这个问题可供进一步讨论。

如果我在这里遗漏了什么,请点亮一下。

1 个答案:

答案 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之内。