我正在尝试使用Microsoft ASP.Net MVC的第一步。我建立了一个简单的数据库,可以测试控制器,视图,模型,ViewModel等所有方面。
背后的情况是拥有简单的项目和资源。每个项目可以有多个资源。每个为项目分配的资源都可以具有角色(字符串)。
我的数据库模型如下所示:
Projects
Id <int>
Name <string>
CreatedAt <datetime>
CreatedBy <string>
Resource
Id <int>
Name <string>
CreatedAt <datetime>
CreatedBy <string>
ProjectResources
Id <int>
ProjectId <int>
ResourceId <int>
Role <string>
CreatedAt <datetime>
CreatedBy <string>
首先要在解决方案中构建EntityClasses。我可以这样:
public class Project
{
public int Id { get; set; }
public string Name { get; set; }
// IS THIS CORRECT? WHERE DO I HAVE TO PUT THE ROLE?
public List<Resource> Resources { get; set; }
public string CreatedBy { get; }
public datetime CreatedAt { get; }
}
public class Resource
{
public int Id { get; set; }
public string Name { get; set; }
public string CreatedBy { get; }
public datetime CreatedAt { get; }
}
这是问题的第一部分。第二部分是ViewModels。我读过的是,ViewModels应该只包含那些在视图上呈现的信息。当我有2个不同目的的3个不同视图时,例如:
所以问题是:ViewModel看起来怎么样?我需要有多个ViewModel(根据我的理解是)?我已经考虑过了,但不知道这是否正常(是否还有ViewModels的NamingConvention):
public class ListOfProjectsViewModel
{
List<Project> projects { get; set; }
}
但在这种情况下,何处以及如何放入已加入的资源?
public class ProjectDetailViewModel
{
Project project { get; set; }
List<Resource> resources { get; set; }
}
在ProjectDetailViewModel类中,我将获得下拉列表的资源列表,但是每个项目添加/选择的资源和所选资源角色的位置在哪里?
答案 0 :(得分:0)
如果项目可以包含多个资源,则Project
将具有Resource
列表的导航属性,而Resource
将具有单个Project
的导航属性。当然,这假设一个资源可以在一个项目上。否则它将是多对多关系,并且您将在两侧都有List<T>
导航属性。
现在角色:根据您的需要,如果Resource
可以拥有多个角色,而且角色显然拥有多个资源,那么双方都需要多对多List<T>
。
此外,您将需要(外键)的简单属性,以便它们可以由数据库强制执行。此外,有些情况下您只需加载Resource
而不加载其Role
(导航属性),因此您需要RoleId
。
至于ViewModels:
就像我说的,我不想开始这场辩论,MVC中没有ViewModel。这就是View具有Model属性的原因。所以无论你传递给它的是模型。这就是模型文件夹的原因。
根据编辑,创建,列表等操作命名您的视图(将显示x项目列表)等。您的Resource
将需要以下结构:
查看:
资源 - 编辑 - 创建 - 列表
型号:
资源 - EditModel或(ResourceEditModel) - CreateModel - ListModel
您的ListModel可能包含Total
,PageNumber
等属性,而您的EditModel
可能会有一个Project
列表,用于下拉列表选择和其他项目。这一切都很正常。所以你有你的视图模型,然后你有你的数据库的模型,你甚至可能有域模型。
显然你会有控制器。一旦开始在客户端使用绑定,错误处理和验证,您将需要ViewModels,但此时您将进入MVVM游乐场。