gpt4 book ai didi

asp.net-mvc - 我可以从操作过滤器返回操作结果吗?

转载 作者:行者123 更新时间:2023-12-03 13:55:57 28 4
gpt4 key购买 nike

通常我会在将数据提交到数据库之前在 action 方法中验证我的模型。

[HttpPost]
public ActionResult MyActionMethod(MyModelType model){
if (ModelState.IsValid){
//commit changes to database...
return View("SuccessView",model);
}
return View(model);
}

但在一些非常罕见的情况下,我需要在提交模型时在业务层执行一些额外的验证。如果发生验证错误,我想在业务层引发异常并使用该异常返回带有验证错误的 View 。

我正在寻找一种方法来实现这一点,而无需更改 Controller 中的任何代码。所以我正在寻找一种方法来避免这种情况:
[HttpPost]
public ActionResult MyActionMethod(MyModelType model){
if (ModelState.IsValid){
try {
//commit changes to database...
} catch (ValidationException e){
ModelState.AddModelError(...);
return View(model);
}
return View("SuccessView",model);

}
return View(model);
}

有没有办法做到这一点?

我正在考虑一个 Action 过滤器,它可以捕获 ValidationExceptions 并在常规 [HandleError] 之前返回带有验证错误的合适 View 。过滤器起作用了。这样的事情可能吗?

编辑:我刚刚找到了解决方案(见下文),但直到 48 小时过去了,我才能将其标记为正确答案......

最佳答案

我刚刚在 ASP.NET MVC 源代码中搜索了一下后找到了解决方案:

它不能用 Action 过滤器完成,因为它在调用 Action 方法之前和之后被调用,但它实际上并没有包装 Action 方法调用。

但是,它可以通过自定义 ActionMethodInvoker 来完成:

public class CustomActionInvoker : ControllerActionInvoker
{
protected override ActionResult InvokeActionMethod(
ControllerContext controllerContext,
ActionDescriptor actionDescriptor,
System.Collections.Generic.IDictionary<string, object> parameters)
{
try
{
//invoke the action method as usual
return base.InvokeActionMethod(controllerContext, actionDescriptor, parameters);
}
catch(ValidationException e)
{
//if some validation exception occurred (in my case in the business layer)
//mark the modelstate as not valid and run the same action method again
//so that it can return the proper view with validation errors.
controllerContext.Controller.ViewData.ModelState.AddModelError("",e.Message);
return base.InvokeActionMethod(controllerContext, actionDescriptor, parameters);
}
}
}

然后,在 Controller 上:
protected override IActionInvoker CreateActionInvoker()
{
return new CustomActionInvoker();
}

关于asp.net-mvc - 我可以从操作过滤器返回操作结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6001321/

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