我有一个ActionResult扩展,可在返回页面时向TomData添加 toast :
public static IActionResult WithMessage(this ActionResult result, InformMessage msg)
{
return new InformMessageResult(result, msg);
}
这是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);
}
}
这与
return RedirectToPage(etc).WithMessage(etc)
等等,但是失败了
return Page().WithMessage(etc)
和调试器亮点
await InnerResult.ExecuteResultAsync(context);
说InnerResult未设置为对象的实例。
有什么办法可以使我使用Return Page()吗?
编辑其他信息:
我测试了作为“InnerResult”发送的内容,并且看起来像使用Return Page()一样,所有内容都是空的(我想说是设计使然,因为在那之前我什么都不做):
使用RedirectToPage():
使用Page():
最佳答案
Page()
和RedirectToPage()
分别是PageResult
和RedirectToPageResult
的辅助方法。因此,您无需调用新方法,而是调用这些方法。
当您调用Page()
时,它会在后台调用ExecuteResultAsync
来呈现PageResult
。此时,所有属性均为空,即Page
,Model
,ViewData
等。由于已经渲染了结果,因此您无法使用ExecuteResultAsync
扩展方法调用另一个WithMessage
。
当您调用RedirectToPage
时,它将发出301/302并生成一个新的Request
,该结果将生成RedirectToPageResult
。因此RedirectToPageResult
尚未呈现,您可以选择使用WithMessage
扩展方法。
话虽如此,我认为使用WithMessage
方法AFAIK时无法利用Page()
。
关于c# - ActionResult扩展不适用于Page()ActionResult方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55989209/