C# 定义“的属性”好吗;模型";输入ViewModel,ASP.net MVC
我读过几篇关于在ASP.NETMVC中使用ViewModel的文章,并意识到它不同于M-V-VM模式中的“ViewModel” 使用ViewModel是为了避免直接从视图访问模型,但在ViewModel中具有类型属性(在模型层定义)是一种好方法吗?这意味着最终我们需要将模型名称空间包含到ViewModel中 例如 型号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;
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; }
}