1

私は自分のウェブサイト用のシンプルなプライベートメッセージシステムを作成しています。モデルは次のとおりです。

public class PrivateMessage : GlobalViewModel
{
    [Key]
    public int MessageId { get; set; }

    public bool IsRead { get; set; }
    public DateTime CreatedDate { get; set; }
    [MaxLength(100)]
    public string Subject { get; set; }

    [MaxLength(2500)]
    public string Body { get; set; }

    public virtual UserProfile Sender { get; set; }

    public virtual UserProfile Receiver { get; set; }
}

新しいメッセージがあるかどうかをすべてのページリクエストで確認したいので、ユーザーに通知できます。したがって、以下を含むベースビューモデルを作成しました。

public class GlobalViewModel
{
    [NotMapped]
    public virtual int NewMessages { get; set; }
}

他のすべてのビューモデルは、このクラスを継承します。ユーザーの新しいプライベートメッセージの量を取得するには、次のようにします。

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        DBContext db = new DBContext();
        int userID = (int)Membership.GetUser().ProviderUserKey;
        int newMessages = db.PrivateMessages.Where(a => a.Receiver.UserId == userID && a.IsRead == false).Count();
        base.OnActionExecuted(filterContext);
    }

私はこれに到達し、OnActionExecutingは実際にすべてのアクションで呼び出されます。しかし、私の質問は次のとおりです。

newMessagesをGlobalViewModelに追加するにはどうすればよいですか?

私が最終的にやりたいのは、これを「マスター」ビューで呼び出すことです

 You have @Model.NewMessages new messages
4

1 に答える 1

3

OnActionExecutedアクションの実行が終了した後に実行されるイベントをオーバーライドできます。これにより、ビューに渡されるモデルを検査し、いくつかのプロパティを設定することでモデルを変更できる可能性があります。

public class PrivateMessageFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutedContext filterContext)
    {
        GlobalViewModel model = null;

        var viewResult = filterContext.Result as ViewResultBase;
        if (viewResult != null)
        {
            // The action returned a ViewResult or PartialViewResult
            // so we could attempt to read the model that was passed
            model = viewResult.Model as GlobalViewModel;
        }

        if (model == null)
        {
            var jsonResult = filterContext.Result as JsonResult;
            if (jsonResult != null)
            {
                // The action returned a JsonResult
                // so we could attempt to read the model that was passed
                model = jsonResult.Data as GlobalViewModel;
            }
        }

        if (model != null)
        {
            // We've managed to read the model 
            // Now we can set its NewMessages property
            model.NewMessages = GetNewMessages();
        }
    }

    private int GetNewMessages()
    {
        int userId = (int)Membership.GetUser().ProviderUserKey;
        int newMessages = db.PrivateMessages.Where(a => a.Receiver.UserId == userId && a.IsRead == false).Count();
    }
}

ベースビューモデルを使用する代わりに、この情報を返すカスタムHTMLヘルパーを作成できます。

于 2012-12-02T15:31:24.860 に答える