如何在asp.net mvc 5中将变量从控制器传递到自定义动作过滤器

时间:2016-05-02 12:22:26

标签: c# asp.net asp.net-mvc

请我协助解决我的代码试图处理上述问题的任何问题。 我之前编写了代码并且它一直在工作,但今天我尝试了它,它似乎不再认识到viewdata值。我确定我必须在某些地方做错事,而我自己却无法弄清楚。

这是控制器动作代码

  // POST: StaffMembers/Create

    [HttpPost]
    [ValidateAntiForgeryToken]
    [PsAuditLog(AuditRecordType = 1)]
    public async Task<ActionResult> Create(StaffMemberViewModel staff, params string[] selectedRoles)
    {
        if (ModelState.IsValid)
        {
            ----unnecessary codes removed for brevity----

                ViewData["ModificationType"] = 1;
                ViewData["auditLogInitVals"] = "";
                ViewData["auditLogFinVals"] = new JavaScriptSerializer().Serialize(StaffMember);
                ViewData["recordId"] = StaffMember.Id;
                TempData["msg"] = "Registration successfull. Login password has been sent to the newly created user's email supplied in the registration";
                return RedirectToAction("View", new { id = StaffMember.Id });
            }

--------为简洁而删除了不必要的代码------

和过滤器上下文中的代码如下

 /// <summary>
/// Used to handle audit trail logs
/// </summary>
/// <param name="filterContext">
/// The endpoint being accessed for the action
/// </param>
public class PsAuditLogAttribute : ActionFilterAttribute
{
    public int AuditRecordType { get; set; }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        ClaimsIdentity identity = filterContext.HttpContext.User.Identity as ClaimsIdentity;


        var userId = filterContext.HttpContext.User.Identity.GetUserId();
        var request = filterContext.HttpContext.Request;
        //var logRecord = filterContext.Controller.ViewData["logRecord"] as dynamic;
        var initialValues = filterContext.Controller.ViewData["auditLogInitVals"] != null ? filterContext.Controller.ViewData["auditLogInitVals"] : null;
        var finalValues = filterContext.Controller.ViewData["auditLogFinVals"] != null ? filterContext.Controller.ViewData["auditLogFinVals"] : null;

        RecordModification modif = new RecordModification();
        modif.AuditRecordTypeId = AuditRecordType;
        modif.ModificationTime = DateTime.Now;
        modif.IPAddress = request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? request.UserHostAddress;
        modif.UrlAccessed = request.RawUrl;
        modif.ApplicationUserId = userId ?? "Anonymous User";
        modif.SessionId = DateTime.Now.ToString() + HttpContext.Current.Session.SessionID;
        modif.UserAgent = request.Browser.Browser + " :: " + request.Browser.Version;
        **modif.ModificationType = (ModificationType)filterContext.Controller.ViewData["ModificationType"];**
        modif.RecordId = filterContext.Controller.ViewData["recordId"].ToString();
        modif.FinalValues = Json.Encode(finalValues);
        modif.InitialValues = Json.Encode(initialValues);

        ApplicationDbContext db = new ApplicationDbContext();
        db.RecordModifications.Add(modif);
        db.SaveChanges();
        base.OnActionExecuted(filterContext);
    }
}

}

但是,带星号的行会引发以下错误:

  

对象引用未设置为对象的实例。

     

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

异常详细信息:System.NullReferenceException:不是对象引用   设置为对象的实例。

     

来源错误:

     

第89行:modif.SessionId = DateTime.Now.ToString()+   HttpContext.Current.Session.SessionID;第90行:
  modif.UserAgent = request.Browser.Browser +&#34; ::&#34; +   request.Browser.Version;第91行:modif.ModificationType =   (ModificationType)filterContext.Controller.TempData [&#34; ModificationType&#34;];   第92行:modif.RecordId =   filterContext.Controller.TempData [&#34;的recordId&#34]。的ToString();第93行:
  modif.FinalValues = Json.Encode(finalValues);

请引导我解决这个问题。

谢谢。

0 个答案:

没有答案