Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 定义“的属性”好吗;模型";输入ViewModel,ASP.net MVC_C#_Asp.net Mvc_Asp.net Mvc 4_Asp.net Mvc Viewmodel - Fatal编程技术网

C# 定义“的属性”好吗;模型";输入ViewModel,ASP.net MVC

C# 定义“的属性”好吗;模型";输入ViewModel,ASP.net MVC,c#,asp.net-mvc,asp.net-mvc-4,asp.net-mvc-viewmodel,C#,Asp.net Mvc,Asp.net Mvc 4,Asp.net Mvc Viewmodel,我读过几篇关于在ASP.NETMVC中使用ViewModel的文章,并意识到它不同于M-V-VM模式中的“ViewModel” 使用ViewModel是为了避免直接从视图访问模型,但在ViewModel中具有类型属性(在模型层定义)是一种好方法吗?这意味着最终我们需要将模型名称空间包含到ViewModel中 例如 型号 1.YesNotbValue实体/POCO类 public partial class YesNoTBDValue { public int Id { get; set;

我读过几篇关于在ASP.NETMVC中使用ViewModel的文章,并意识到它不同于M-V-VM模式中的“ViewModel”

使用ViewModel是为了避免直接从视图访问模型,但在ViewModel中具有类型属性(在模型层定义)是一种好方法吗?这意味着最终我们需要将模型名称空间包含到ViewModel中

例如

型号
1.YesNotbValue实体/POCO类

public partial class YesNoTBDValue
{
    public int Id { get; set; }
    public string Name { get; set; }
}
2在项目实体中使用的YesNotbValue类(在模型本身中定义)

查看模型
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; }
}
查看
显示“是”“非默认值”列表中的下拉列表,并将所选项目保留在IsAvailable SelectedItemId中

@Html.DropDownList("IsAvailableSelectedItemId ", 
new SelectList(Model.YesNoTBDValues, "Id", "Name",
            Model.IsAvailableSelectedItemId ))
请告诉我应该如何正确编码

重复问题:ViewModel应该包括模型的名称空间吗?在我的示例中,是在模型中定义的,为了使用它,我使用了模型的名称空间

/另一种方法/

对我现有的方法不满意,我从github下载了Microsoft Nuget Gallery源代码,并意识到他们从未在VIEWMODEL内部使用过模型,这对我来说很有意义。我稍微修改了上面的代码(为了从ViewModel中删除模型的引用),发现它工作得很好

这是我的零钱:

型号不变

查看模型
1.创建YesNotbValue类的副本,比如说YesNotbValue视图模型

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;}
}
并且发现在这些改变之后,它也工作得很好。我喜欢第二种方法,因为在这个中,模型和视图模型是完全分开的。继续讨论这个问题


如果我在这里遗漏了什么,请给我一些提示。

我试图保持
ViewModel
只包含在视图上下文中自然的简单类型。这样,我将视图中的渲染逻辑保持在最小,并保持视图干净

您的ViewModel可以非常简单地表示为:

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

公共类ProjectEditViewModel
{
public int YesNoTBDValueSelected{get;set;}
公共IEnumerable YesNotbValueOptions{get;set;}
}

现在生成
SelectList
的逻辑进入
项目
ProjectEditViewModel
映射,并且被排除在
视图之外

为什么不使用MVC?MVVM是PM的派生,PM用于丰富的UI应用程序。我不确定MVVM是否也适用于ASP.net。@BillZhang:这里我不是在引用MVVM模式。事实上,ASP.NETMVC4中的视图模型和MVVM模式中的视图模型不同。关于ASP.net MVC4中是否需要ViewModel(在StackOverflow本身)存在着巨大的争论,总体而言(在这些争论中)最好使用ViewModel。你的想法是什么?ViewModel是一种特殊的视图模型。在WPF和PM模式中,视图和演示者通过数据绑定和命令进行通信,所以演示者演变成一个更像模型的对象,称为ViewModel。我不熟悉ASP.Net/MVC,如果您的模型不能满足视图需要,例如,需要复杂的数据转换器,您可以引入一个类似ViewModel的层,使模型更加友好。我认为这很合理。就连我也有同样的经历。我过去的经验是使用WPF应用程序和MVVM模式。但两者之间有区别。关于WPF中的MVVM,你是对的。即使我只是第一次用这种方式实现,但我还是被“如何将选定的下拉项传递给控制器post操作”所困扰。现在一切都已设置好,没有花太多时间就将所有内容更改为使用SelectList。(仍然无法使用IEnumerable,它会引发类似“SelectListItem不包含名为“id”的属性”的错误)。将在此处快速上载代码。我很高兴看到我的编辑未被批准。我添加了使用此方法实现的完整代码。这肯定对某些人有帮助。@Rohitkandal您可以添加新代码作为另一个答案,我相信这将对某些人有所帮助。
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()
}
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; }
}