0

削除と編集を記録したいのですが、actionFilter 属性を delete および edit [ post ] メソッドに適用するのが最善の方法だと考えました。

しかし、最終結果はアクションへのリダイレクトであるため、Context.RedirectToAction の結果しか利用できないため、私の Context.Result は常に null です。

削除機能と編集機能にプラグインするコードを作成する前に、このようなことを試した人はいますか?アドバイスをいただけますか?

ありがとう

アクションコード:

[HttpPost, ValidateInput(false)]
    [SiteChangeLogger(LogType = "Update", TableName = "Affiliates")]
    public ActionResult Edit(Affiliate affiliate, FormCollection form)
    {
        var existing = db2.Affiliates.SingleOrDefault(x => x.AffiliateId == affiliate.AffiliateId);
        ViewBag.before = Common.Strings.Base64Encode(Common.Strings.ToJsonString(existing));
        if (ModelState.IsValid)
        {
            try
            {
                var curFiles = new NameValueCollection();
                curFiles["AffiliateLogo"] = affiliate.AffiliateLogo;
                if (!String.IsNullOrWhiteSpace(form["AffiliateLogo"]))
                {
                     UploadFiles(form,curFiles);
                     TryUpdateModel(affiliate, form);

                     var oldFileName = affiliate.AffiliateLogo;
                     var newFileName = Common.Strings.RandomFileName();
                     new WebImage(Server.MapPath("~/Content/images/" + affiliate.AffiliateLogo))
                         .Resize(200, 50, true, true)
                         .Crop(1, 1)
                         .Save(Server.MapPath("~/Content/images/" + newFileName), "png", true);
                     affiliate.AffiliateLogo = newFileName + ".png";
                     Common.Common.TryAndDeleteFile("~/Content/images/" + oldFileName);
                }
                else
                {
                    affiliate.AffiliateLogo = existing.AffiliateLogo;
                }

            }
            catch (Exception ex)
            {
                Common.Common.CompileErrorMessage(ex,"ADMIN.Affiliate.Edit");
            }
            finally
            {
                db.Entry(affiliate).State = EntityState.Modified;
                db.SaveChanges();   
            }
            ViewBag.after = Common.Strings.Base64Encode(Common.Strings.ToJsonString(affiliate));
            return RedirectToAction("Index");
        }
        return View(affiliate);
    }

私のフィルターコード

public override void OnResultExecuted(ResultExecutedContext fc)
    {
        var viewResult = fc.Result as ViewResult;

        if(viewResult == null) return;

        var beforeData = viewResult.ViewBag.before;
        var afterData = viewResult.ViewBag.after;

        if (beforeData == null && afterData == null) return;

        var ctx = new SgeGamesContext();
        var eventId = 0;
        var siteChangeLogEvent = ctx.SiteChangeLogEvents.SingleOrDefault(x => x.SiteChangeLogEventName == LogType);
        if (siteChangeLogEvent != null)
        {
            eventId = siteChangeLogEvent.SiteChangeLogEventId;
        }

        var model = new Sge.Games.Data.Models.SiteChangeLog
                        {
                            SiteChangeLogTable = TableName,
                            SiteId = 1,
                            SiteChangeLogAfterContent = afterData,
                            SiteChangeLogBeforeContent = beforeData,
                            SiteChangeLogEventId = eventId
                        };
        ctx.SiteChangeLogs.Add(model);
        ctx.SaveChanges();

        base.OnResultExecuted(fc);
    }
4

1 に答える 1

2

ViewBag に直接アクセスできます。ViewResult は必要ありません。

public override void OnResultExecuted(ResultExecutedContext fc)
{
    var before = fc.Controller.ViewBag.before;
    var after = fc.Controller.ViewBag.after;
    ...
}

OnActionExecutedまた、おそらく の代わりにイベントを使用したいと思うでしょうOnResultExecuted

于 2012-05-24T13:10:32.077 に答える