1

MVC は初めてなので、質問をお許しください。

と の 2 つのモデルを作成ObservationしましStaffMemberた。観察はスタッフ メンバーによって実行され、観察レコードに対して 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 パターンの正しい使用ですか、それとも別の方法でこれを行う必要がありますか?

コメントや提案をお寄せいただきありがとうございます。

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

最良の方法は、各モデルを異なるクラスに分けることです。1 対 1 の関係がある場合、モデルは問題ありません。次のようなメソッドを呼び出すことができます

GetStaffMemberById(Guid Id)
{
     //Add your code to fetch the StaffMember
}

より大きなモデルで 2 つのモデルの関連付けを示す必要があるよりも 1 対多の関係がある場合は、StaffMemberObeservation/OberservationStaffMember という複合モデルを親子の関連付けとして使用できます。あなたの StaffMember に複数の Observation がある場合

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 に答える