我在这个MVC实现中混合了控制器/模型

时间:2013-07-20 22:35:35

标签: asp.net-mvc model-view-controller

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

我创建了两个模型,ObservationStaffMember。由工作人员进行观察,并根据观察记录记录职员(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模式的正确使用还是我应该以不同的方式做到这一点?

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

2 个答案:

答案 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:您似乎正在返回纯数据库对象,这在大型项目中无法实际维护。您应该将这些数据库对象“转换”或“项目化”为视图模型。

this link gives a pretty good explanation on how to do this

答案 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; }

}