Расширение ActionResult не работает с методом Page () ActionResult - PullRequest
6 голосов
/ 05 мая 2019

У меня есть расширение для ActionResult, которое добавляет тост в TempData при возврате страницы:

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 () все равно null (я бы сказал, что по замыслу я ничего не делаю до этого момента):

с RedirectToPage ():

enter image description here

С Page ():

enter image description here

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Проблема, которую я подозреваю, заключается в том, что Page () и RedirectToPage () наследуются от разных базовых классов.

RedirectToPage () согласно этой документации . Имеет следующее наследование:

Объект -> ActionResult -> RedirectToPageResult

Это проявляется в некотором наследовании контроллера. Итак, вы можете использовать расширение ActionResult.

Однако метод Page () является частью класса RazorPages согласно этой документации . Итак, это наследование выглядит следующим образом: 1

Object -> RazorPageBase -> PageBase -> Page

Теперь метод Page () этого класса возвращает PageResult, который выглядит как наследник от ActionResult как , определенного здесь.

Итак, учитывая это, я бы предложил сначала привести его к базе ActionResult, а затем использовать метод расширения. Возможно, что-то вроде этого:

var baseClass = (Page() as ActionResult);
return baseClass.WithMessage(etc);

1 Вы можете увидеть базовый тип на втором изображении поставляемого OP.

0 голосов
/ 16 мая 2019

Page() и RedirectToPage() являются вспомогательными методами для PageResult и RedirectToPageResult соответственно.Поэтому вместо обновления вы вызываете эти методы.

Когда вы вызываете Page(), он вызывает ExecuteResultAsync за кулисами для визуализации PageResult.В этот момент все свойства имеют значение null, т. Е. Page, Model, ViewData и т. Д. Так как результат уже обработан, вы не можете вызвать другой ExecuteResultAsync, используя метод расширения WithMessage.

Когда вы звоните RedirectToPage, он выдает 301/302 и генерирует новый Request, что приведет к RedirectToPageResult.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *] При использовании

Сказав это, я не думаю, что можно использовать WithMessage* метод, AFAIK.

...