C# 重定向到操作后从筛选器获取模型
目前有一个动作过滤器,它基本上检查TempData,如果TempData中有某种类型的项,它会将其添加到模型中。当浏览所有“返回视图(模型)”等的站点时,这非常有效。然而,在某一点上,我想执行一个“重定向到操作”,但它不起作用。模型总是空的 过滤器C# 重定向到操作后从筛选器获取模型,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,目前有一个动作过滤器,它基本上检查TempData,如果TempData中有某种类型的项,它会将其添加到模型中。当浏览所有“返回视图(模型)”等的站点时,这非常有效。然而,在某一点上,我想执行一个“重定向到操作”,但它不起作用。模型总是空的 过滤器 public class ToastFilter : IActionFilter { public void OnActionExecuted(ActionExecutedContext context) { var
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);
}
[HttpPost]
[ValidateAntiForgeryToken]
[授权角色(Settings.SystemAdministratorRole,“公司管理”)]
公共异步任务索引(CompanyDetailsModel模型)
{
var modelText=_stringLocalizerFactory.Create(typeof(CompanyDetailsModel));
var commonText=_stringLocalizerFactory.Create(typeof(Common.System.Resource.CommonResources));
如果(!ValidationManager.IsValid(ModelState、model.DynamicProperties))
{
添加(Guid.NewGuid().ToString(),ValidationManager.CreateValidationMessage(ModelState,model));
返回视图(模型);
}
var companyExists=model.CompanyId.HasValue;
var companyUpsertResult=await_company.UpsertCompany(模型);
开关(companyUpsertResult.Item1)
{
案例一般结果。成功:
TempData.Add(Guid.NewGuid().ToString(),
公司存在者
?到lper.GenerateToast(modelText[“UpdateSuccessMessage”],
commonText[“Success”],Icons.ThumbsUp,5000,
ToastSize.Small,Settings.GreenMessage)
:ToastHelper.GenerateToast(modelText[“CreateSuccesessage”],
commonText[“Success”],Icons.ThumbsUp,5000,
ToastSize.Small,Settings.GreenMessage);
返回重定向到操作(“列表”);
案例GenericOutcome。失败:
TempData.Add(Guid.NewGuid().ToString(),
公司存在者
?到alper.GenerateToast(modelText[“UpdateFailedMessage”],
commonText[“失败”],Icons.ThumbsDown,
5000,最大尺寸。小,设置。红色消息)
:ToastHelper.GenerateToast(modelText[“CreateFailedMessage”],
commonText[“失败”],Icons.ThumbsDown,
5000,ToastSize.Small,Settings.RedMessage);
返回视图(模型);
}
返回视图(模型);
}
[授权(角色=设置.SystemAdministratorRole)]
公共IActionResult列表()
{
var模型=新的CompanyListModel();
返回视图(模型);
}
这就是它未能认识到自己有一个模式的地方。如果通用结果是失败的,并且它使用标准返回视图(模型)路由,那么这一切都可以完美地工作
如果通过“RedirectToAction”使用过滤器,你知道如何让它工作吗
谢谢您确定
CompanyListModel
继承了MyApp.Common.Models.Misc.BaseModel
?是的public class CompanyListModel:BaseModel{}
当模型为空时,过滤器中的context.ActionDescriptor.DisplayName
是什么?