我在asp.net MVC2应用程序中工作,我有与模型设计有关的问题。我有一个edmx文件,其中包含所有实体。我有一个名为whiteoutviewmodel的视图模型,它使用三个实体列表和三个其他集合,如下所示:
public class WhiteoutViewModel
{
public List<Entities.Server> Servers { get; set; }
public List<Entities.Whiteout> Whiteouts { get; set; }
public List<Entities.Field> Fields { get; set; }
public ArrayList Hours {get;set;}
public ArrayList Minutes {get;set;}
public ArrayList AMPM {get;set;}
public ArrayList RepeatList{get;set;}
}
我已根据此Viewmodel创建了一个视图。现在我需要一个应该是类型的局部视图 白茫茫。我创建了一个whiteout类并在其中添加了一些属性。
public class WhiteoutDTO
{
public int WhiteoutId { get; set; }
public int FieldId { get; set; }
public int StartHour { get; set; }
public int StartMinute { get; set; }
public string StartTime { get; set; }
public int EndHour { get; set; }
public int EndMinute { get; set; }
public string EndTime { get; set; }
public string Repeats { get; set; }
public bool IsActive { get; set; }
public enmDays Days { get; set; }
}
现在我有两个Whiteout课程。一个来自edmx,另一个是我创建的。我是否需要对edmx类型或我创建的类型进行局部视图?我创建我的类的原因是我需要一些不在数据库表/ edmx whiteout中的属性。我应该将我的whiteout类作为上面ViewModel的属性吗?
[编辑]
我有一个viewoutodel,其中包含whiteout(edmx)列表,我还需要单个Whiteout,所以我的viewmodel可以这样:
public class viewmodel {
// of edmx entity type
public List<Entities.Whiteout> Whiteouts { get; set; }
// of my DTO type where my DTO has some properties which are not in edmx whiteout entity
public WhiteoutDTO myWhiteout {get;set;}
}
我也希望我的类型为Whiteout的主视图作为myWhiteout类型的部分视图。是否可能并且是良好的做法。我可以将mywhitout从主视图传递到主视图为Whiteouts类型的局部视图。
现在我的部分视图包括这样:
Html.RenderPartial("WhiteoutList", Model);
请建议
答案 0 :(得分:1)
我尝试将视图与数据访问相关的任何内容完全分开,这包括由ORM生成的任何内容。
你想要的是让你的观点尽可能地愚蠢。 ViewModels只是为了给你的视图提供它所需要的东西,作为回报,给你一些关于用户可能输入的数据的信息。
想象一下登录页面, 您有一个由实体框架生成的用户,然后您需要某种介体对象,它将从您的视图中来回传输数据。话虽如此,您不希望从Entity Framework为您生成的User类创建强类型视图。
您想要的是创建一个LoginUserViewModel,其中包含足够的信息,以便视图能够登录用户并将信息发回服务器以进行身份验证和授权。
发生的问题和丑陋的管道代码是您现在必须手动将LoginUserViewModel中的属性映射到User。
你能做的就是使用类似AutoMapper的东西,这样可以让事情变得更加清洁和轻松。
即
AutoMapper.Mapper.Map<AccountLoginViewModel, User>(accountLoginViewModel, user);
答案 1 :(得分:0)
您可以使用分部类扩展模型:
Public partial class Whiteout{
Public string NewStringProperty{get;set;}
}