1

MVC 的新手,所以请原谅这个问题。

我创建了两个模型,Observation并且StaffMember. 一名工作人员进行了一次观察,我根据观察记录记录了 StaffMember 的 ID (GUID)。在显示结果时,我希望显示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 模式的正确使用还是我应该以不同的方式这样做?

提前感谢您的任何意见或建议。

4

2 回答 2

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等)保留在视图模型之外。更好的一步是将您的逻辑放在控制器方法中。更好的是,放置一个额外的层,您可以在其中进行所有数据库检索。

通过这种方式,控制器和视图保持尽可能简单。

在您的情况下,我会做以下事情,我会像这样创建一个 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;
} 
}

然后,在控制器中,设置视图模型:

public ActionResult GetInformation(Guid id)
{
var vm = new StaffMemberViewModel();
vm.StaffMemberName = memberService.GetStaffMemberById(id);
return View(vm);
}

这样,您的视图模型可以更改为

public string StaffMemberName {get;set;}

编辑:我更关注视图模型中的数据库检索方面,但@Miller Koijam 也提出了一个很好的观点,将这些不同的模型封装到一个复合视图模型中。

编辑编号 2:您似乎返回的是纯数据库对象,这在大型项目中并不是真正可维护的。您应该将这些数据库对象“转换”或“投影”为视图模型。

这个链接很好地解释了如何做到这一点

于 2013-07-20T22:54:17.057 回答
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; }

}
于 2013-07-20T22:51:41.717 回答