В настоящее время имеется фильтр действий, который в основном проверяет TempData, и, если в TempData есть элементы определенного типа, он добавляет их в модель. Это прекрасно работает при просмотре сайта с возвратом (модель) и т. Д. Однако в какой-то момент я хочу выполнить RedirectToAction, который не работает. Модель всегда NULL.
Фильтр ...
public class ToastFilter : IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{
var _tempDataDictionaryFactory = context.HttpContext.RequestServices.GetService(typeof(ITempDataDictionaryFactory)) as ITempDataDictionaryFactory;
var result = context.Result as ViewResult;
var tempData = _tempDataDictionaryFactory.GetTempData(context.HttpContext);
var model = result?.Model as MyApp.Common.Models.Misc.BaseModel;
if (model == null)
return;
if (tempData.Keys.Count > 0)
model.Toasts.AddRange(tempData.Where(td => td.Value is ToastModel).Select(td => td.Value as ToastModel));
}
public void OnActionExecuting(ActionExecutingContext context)
{
//Do Nothing
}
}
Контроллер ...
[HttpPost]
[ValidateAntiForgeryToken]
[AuthorizeRoles(Settings.SystemAdministratorRole, "Company_Admin")]
public async Task<IActionResult> Index(CompanyDetailsModel model)
{
var modelText = _stringLocalizerFactory.Create(typeof(CompanyDetailsModel));
var commonText = _stringLocalizerFactory.Create(typeof(Common.System.Resource.CommonResources));
if (!ValidationManager.IsValid(ModelState, model.DynamicProperties))
{
TempData.Add(Guid.NewGuid().ToString(), ValidationManager.CreateValidationMessage(ModelState, model));
return View(model);
}
var companyExists = model.CompanyId.HasValue;
var companyUpsertResult = await _company.UpsertCompany(model);
switch (companyUpsertResult.Item1)
{
case GenericOutcome.Success:
TempData.Add(Guid.NewGuid().ToString(),
companyExists
? ToastHelper.GenerateToast(modelText["UpdateSuccessMessage"],
commonText["Success"], Icons.ThumbsUp, 5000,
ToastSize.Small, Settings.GreenMessage)
: ToastHelper.GenerateToast(modelText["CreateSuccessMessage"],
commonText["Success"], Icons.ThumbsUp, 5000,
ToastSize.Small, Settings.GreenMessage));
return RedirectToAction("List");
case GenericOutcome.Failure:
TempData.Add(Guid.NewGuid().ToString(),
companyExists
? ToastHelper.GenerateToast(modelText["UpdateFailedMessage"],
commonText["Failure"], Icons.ThumbsDown,
5000, ToastSize.Small, Settings.RedMessage)
: ToastHelper.GenerateToast(modelText["CreateFailedMessage"],
commonText["Failure"], Icons.ThumbsDown,
5000, ToastSize.Small, Settings.RedMessage));
return View(model);
}
return View(model);
}
[Authorize(Roles = Settings.SystemAdministratorRole)]
public IActionResult List()
{
var model = new CompanyListModel();
return View(model);
}
Здесь он не может распознать, что у него есть модель. Все это прекрасно работает, если общий результат является ошибкой, и он использует стандартный маршрут Return View (модель).
Есть идеи, как заставить фильтр работать, если он используется через 'RedirectToAction'?
Спасибо