0

我希望记录删除和编辑,并认为最好的方法是将一个 actionFilter 属性应用于我的删除和编辑 [post] 方法

但是因为最终结果是重定向到操作,所以我的 Context.Result 始终为空,因为只有 Context.RedirectToAction 结果可用。

现在,在我创建一些代码来插入我的删除和编辑功能之前,有没有人尝试过这样的事情!,你能建议吗?

谢谢

操作代码:

[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 回答