MVC的新手,请原谅这个问题。
我创建了两个模型,Observation
和StaffMember
。由工作人员进行观察,并根据观察记录记录职员(GUID)的ID。在显示结果时,我希望显示StaffMember.FullName
而不是StaffMember.StaffMemberId
。
我通过使用以下模型实现了这一目标:
public class Observation
{
public Guid ObservationId { get; set; }
public string Observer { get; set; }
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime ObservationDate { get; set; }
public Guid StaffMemberId { get; set; }
public int? ObservationGrade { get; set; }
public virtual IEnumerable<StaffMember> StaffMembers { get; set; }
public string StaffMemberName
{
get
{
var db = new ObservationTrackerContext();
var staffMember = db.StaffMembers.FirstOrDefault(s => s.StaffMemberId == StaffMemberId);
return staffMember != null ? staffMember.FullName : "Missing entry or error";
}
}
}
我有点担心我将模型的定义与数据库交互混合在一起。这是MVC模式的正确使用还是我应该以不同的方式做到这一点?
提前感谢任何意见或建议。
答案 0 :(得分:3)
我认为你指的是最后一部分:
public string StaffMemberName
{
get
{ var db = new ObservationTrackerContext();
var staffMember = db.StaffMembers.FirstOrDefault(s => s.StaffMemberId == StaffMemberId);
return staffMember != null ? staffMember.FullName : "Missing entry or error";
}
}
我个人认为虽然这可行,但这并不是最干净的做事方式。
我保持我的视图模型尽可能简洁明了,所以基本上只有一堆{get;set;}
背后的属性。
您如何在此视图模型中设置其他属性?
您是否有任何理由不能像设置StaffMemberName
那样设置StaffMemberId
?
我个人会将所有逻辑(除了DataAnnotations
等)保留在viewmodel之外。
更好的一步是将您的逻辑放在控制器方法中。
更好的方法是放入一个额外的层,在那里进行所有数据库检索。
通过这种方式,控制器和视图尽可能简单。
我要做的是以下内容,我会创建一个像这样的MemberService:
public class MemberService
{
public string GetStaffMemberById(Guid Id)
{
var db = new ObservationTrackerContext();
var staffMember = db.StaffMembers.FirstOrDefault(s => s.StaffMemberId == StaffMemberId);return staffMember != null ? staffMember.FullName : "Missing entry or error";
return staffMember;
}
}
然后,在控制器中,设置viewmodel:
public ActionResult GetInformation(Guid id)
{
var vm = new StaffMemberViewModel();
vm.StaffMemberName = memberService.GetStaffMemberById(id);
return View(vm);
}
通过这种方式,您的viewmodel可以改为
public string StaffMemberName {get;set;}
编辑:我更关注viewmodel中的数据库检索方面,但@Miller Koijam也提出了一个很好的观点,将这些不同的模型封装到一个复合视图模型中。
编辑编号2:您似乎正在返回纯数据库对象,这在大型项目中无法实际维护。您应该将这些数据库对象“转换”或“项目化”为视图模型。
答案 1 :(得分:2)
最好的方法是将不同类别的每个模型分开。 如果有一对一的关系,那么你的模型就可以了。 你可以有一个类似
的方法GetStaffMemberById(Guid Id)
{
//Add your code to fetch the StaffMember
}
如果有一对多的关系比 你需要在更大的模型中显示两个模型的关联,你可以使用名为StaffMemberObeservation / OberservationStaffMember的复合模型作为父子的关联性。 如果您的StaffMember有多个观察而不是
public class StaffMemberObeservation
{
public Observation { get; set; }
public IList <StaffMember>{ get; set; }
}
如果您的观察工作人员多于
public class ObersavtionStaffMember
{
public Staff Member{ get; set; }
public IList <Observation> { get; set; }
}