3

我已经阅读了几篇关于在 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()
}

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

如果我在这里遗漏了一些东西,请给我一些启发。

4

1 回答 1

1

我尝试保留ViewModel仅包含在视图上下文中自然的简单类型。这样,我将视图中的渲染逻辑保持在最低限度并保持视图清洁。

Your ViewModel can be represented very simply with something like:

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

or

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

Now logic for generating SelectList goes in your Project <-> ProjectEditViewModel mapping and is kept out of View.

于 2013-06-30T10:57:09.540 回答