簡體   English   中英

OnActionExecuted方法無法在.NetCore 2.0中重寫

[英]OnActionExecuted method cant be overriden in .NetCore 2.0

在我過去用過測試各種項目的測試應用程序中,我有一個基本控制器。

BaseController(MVC5)

    public abstract class BaseController : Controller
    {
        protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (User != null)
            {
                var context = new ApplicationDbContext();
                var username = User.Identity.Name;
                var iconSource = ServicesAppSettings.UserIcons.FemaleUserIconSource;

                if (!string.IsNullOrEmpty(username))
                {
                    var user = context.Users.SingleOrDefault(u => u.UserName == username);
                    if (user != null)
                    {
                        var gender = user.GetUserGender(username);
                        if (gender == DomainClasses.Enums.Gender.Male)
                        {
                            iconSource = ServicesAppSettings.UserIcons.MaleUserIconSource;
                        }
                        var fullName = user.GetFullName(username);
                        ViewData.Add("FullName", fullName);
                        ViewData.Add("IconSource", iconSource);
                    }
                }
            }
            base.OnActionExecuted(filterContext);
        }       
    }

我現在正在為自己構建一個Core 2.0 Web模板,並且正在嘗試在Core 2.0中實現基本控制器,但該方法錯誤。

BaseController(MVC 6,.Net core 2.0)

protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (User != null)
        {
            var baseArgs = new[] { "TestApp" };
            var context = ApplicationDbContextFactory.CreateDbContext(baseArgs);
            var username = User.Identity.Name;
            var iconSource = _config.GetSection("FemaleUserIcon");

            if (!string.IsNullOrEmpty(username))
            {
                var user = context.Users.SingleOrDefault(u => u.UserName == username);
                if (user != null)
                {
                    var gender = user.GetUserGender(username);
                    if (gender == Gender.Male)
                    {
                        iconSource = _config.GetSection("MaleUserIcon");
                    }
                    var fullName = user.GetFullName(username);
                    ViewData.Add("FullName", fullName);
                    ViewData.Add("IconSource", iconSource);
                }
            }
        }
        base.OnActionExecuted(filterContext);
    }

並且錯誤消息與受保護的方法有關

'BaseController.OnActionExecuted(ActionExecutedContext)':覆蓋'public'繼承成員時無法更改訪問修飾符

這在MVC 5中運行得非常好,現在使用MVC 6和.Net Core 2,這是失敗的。 知道為什么在這種情況下這種方法不能被保護或私有嗎? 我不明白為什么需要公開。

此外,現在我正在重新查看此代碼,這是每次調用控制器操作時檢索用戶,不是嗎? 在用戶第一次登錄時,必須有更好的方法來存儲此信息.SqlDistributedCache?

基本Controller類中方法的訪問修飾符是public而不是protected

public virtual void OnActionExecuted(ActionExecutedContext context);

您也可以在官方源代碼中看到這一點

編譯器錯誤告訴您無法在繼承的類中更改它。 所以你只需要改變你的匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM