ActionResult扩展名不适用于Page()ActionResult方法

lin*_*982 6 c# extension-methods asp.net-core razor-pages

我有一个ActionResult扩展,​​可在返回页面时向TomData添加烤面包:

public static IActionResult WithMessage(this ActionResult result, InformMessage msg)
{
    return new InformMessageResult(result, msg);
}
Run Code Online (Sandbox Code Playgroud)

这是InformMessageResult:

public class InformMessageResult : ActionResult
    {
        public ActionResult InnerResult { get; set; }
        public InformMessage InformMessage { get; set; }

        public InformMessageResult (ActionResult innerResult, InformMessage informMsg)
        {
            InnerResult = innerResult;
            InformMessage = informMsg;
        }

        public override async Task ExecuteResultAsync(ActionContext context)
        {
            ITempDataDictionaryFactory factory = context.HttpContext.RequestServices.GetService(typeof(ITempDataDictionaryFactory)) as ITempDataDictionaryFactory;
            ITempDataDictionary tempData = factory.GetTempData(context.HttpContext);

            tempData.Put("InformMessage", InformMessage);

            await InnerResult.ExecuteResultAsync(context);
        }
    }
Run Code Online (Sandbox Code Playgroud)

这与

return RedirectToPage(etc).WithMessage(etc)
Run Code Online (Sandbox Code Playgroud)

等等,但是失败了

return Page().WithMessage(etc)
Run Code Online (Sandbox Code Playgroud)

和调试器亮点

await InnerResult.ExecuteResultAsync(context);
Run Code Online (Sandbox Code Playgroud)

说InnerResult未设置为对象的实例。

有什么办法可以使我使用Return Page()吗?

编辑其他信息:

我测试了作为“ InnerResult”发送的内容,并且看起来像使用Return Page()一样,所有内容都是空的(我想说是设计使然,因为在那之前我什么都不做):

使用RedirectToPage():

在此处输入图片说明

使用Page():

在此处输入图片说明

Sha*_*san 0

Page()和分别RedirectToPage()PageResult和的辅助方法RedirectToPageResult。因此,您不用更新,而是调用这些方法。

当您调用Page()它时,它会ExecuteResultAsync在幕后调用来渲染PageResult. 此时,所有属性均为 null Page,即ModelViewData等。由于结果已经呈现,因此您无法ExecuteResultAsync使用WithMessage扩展方法调用另一个属性。

当您调用RedirectToPage它时,它会发出 301/302 并生成一个新的Request,这将导致RedirectToPageResult. 因此RedirectToPageResult尚未呈现,您可以选择使用您的WithMessage扩展方法。

话虽如此,我认为不可能使用WithMessagewhen usingPage()方法,AFAIK。