gpt4 book ai didi

asp.net-mvc-3 - MVC 模型在 OnExecuted 操作过滤器中为空……还是设置模型的更优雅的方式?

转载 作者:行者123 更新时间:2023-12-04 12:43:07 25 4
gpt4 key购买 nike

我有一个 ActionFilter 覆盖 OnActionExecuted 方法。 filterContext.Controller.ViewData.Model 在 POST 操作中始终为 null。我确实发现以下文章似乎在说它不应该为空,但这一定是 MVC 的早期版本。这是MVC3。我应该得到什么?

Model availability inside ActionFilter

更新:

我已经找到了原始问题的答案。我有一个自定义的 ActionResult,它输出带有自定义日期格式化程序的 JSON。问题是模型没有在 Controller 中设置。

在我的自定义 ActionResult 中,ExecuteResult 方法传递了 ControllerContext,如果我可以在那里设置模型,那就太好了:

context.Controller.ViewData.Model = _data;

但这是在周期的后期,结果在 ActionFilter 中仍然为空。这似乎意味着我需要在 Controller 中手动设置模型:
ControllerContext.Controller.ViewData.Model = model; 

或者
View(model);

这意味着我每次使用这个自定义 ActionResult 时都需要记住这样做。有没有更优雅的方式?

另一个更新:

我找到了一种方法来做到这一点,只是没有我希望的那么优雅。

在我在 Controller 中发送的 comstom ActionResult 的构造函数中,至少它会始终保持一致:
public JsonNetResult(object data, Controller controller) {
SerializerSettings = new JsonSerializerSettings();
_data = data;
controller.ControllerContext.Controller.ViewData.Model = _data;
}

最佳答案

另一种方法是使用基本 Controller 来自动处理 Action 参数集合的存储以供以后使用:

public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Items["ActionParms"] = filterContext.ActionParameters.ToDictionary(p => p.Key, p => p.Value);
base.OnActionExecuting(filterContext);
}
}

然后在您的属性中:
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var dictionary = filterContext.HttpContext.Items["ActionParms"] as Dictionary<string, object>;
if (dictionary != null)
{
foreach (var o in dictionary.Keys)
{
// do something here
}
}
base.OnActionExecuted(filterContext);
}

它使用 HttpContext 项目,这不是很好,但我不知道您可以在属性中访问您的 ViewBag 或 ViewData。

为了决定是否要处理属性中的请求,您可以查询操作名称和其他参数信息:
var action = filterContext.ActionDescriptor.ActionName;
var parms = filterContext.ActionDescriptor.GetParameters();
foreach (var parameterDescriptor in parms)
{
// do something here
}

关于asp.net-mvc-3 - MVC 模型在 OnExecuted 操作过滤器中为空……还是设置模型的更优雅的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6155114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com