- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当在强类型 View 上使用内置验证助手实现错误处理时,您通常会在 Controller 中创建一个 try/catch block ,并返回一个 View 及其对应的模型作为 的参数View()
方法:
Controller
public class MessageController : Controller
{
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Models.Entities.Message message)
{
try
{
// Insert model into database
var dc = new DataContext();
dc.Messages.InsertOnSubmit(message);
dc.SubmitChanges();
return RedirectToAction("List");
}
catch
{
/* If insert fails, return a view with it's corresponding model to
enable validation helpers */
return View(message);
}
}
}
观点
<%@ Page
Language="C#"
Inherits="System.Web.Mvc.ViewPage<Models.Entities.Message>" %>
<%= Html.ValidationSummary("Fill out fields marked with *") %>
<% using (Html.BeginForm()) { %>
<div><%= Html.TextBox("MessageText") %></div>
<div><%= Html.ValidationMessage("MessageText", "*") %></div>
<% } %>
我已经以 ActionFilterAttribute 的形式实现了一个简单的错误处理程序,它将能够重定向到一个通用错误 View ,或者重定向到抛出异常的 View ,并让验证助手活跃起来。
这是我的 ActionFilterAttribute 的样子:
public class ErrorLoggingAttribute : ActionFilterAttribute, IExceptionFilter
{
private Boolean _onErrorRedirectToGenericErrorView;
/// <param name="onErrorRedirectToGenericErrorView">
/// True: redirect to a generic error view.
/// False: redirect back the view which threw an exception
/// </param>
public ErrorLoggingAttribute(Boolean onErrorRedirectToGenericErrorView)
{
_onErrorRedirectToGenericErrorView = onErrorRedirectToGenericErrorView;
}
public void OnException(ExceptionContext ec)
{
if (_onErrorRedirectToGenericErrorView)
{
/* Redirect back to the view where the exception was thrown and
include it's model so the validation helpers will work */
}
else
{
// Redirect to a generic error view
ec.Result = new RedirectToRouteResult(new RouteValueDictionary
{
{"controller", "Error"},
{"action", "Index"}
});
ec.ExceptionHandled = true;
}
}
}
重定向到抛出异常的 View 相当简单。但问题在于:为了让验证助手工作,您需要为 View 提供它的模型。
如何返回抛出异常的 View 并为 View 提供相应的模型? (在本例中 Models.Entities.Message
)。
最佳答案
我让它工作了!
出于某些奇怪的原因,我需要做的就是将 ViewData
传递给新的 ResultView
。
完整代码如下:
public class ErrorLoggingAttribute : ActionFilterAttribute, IExceptionFilter
{
private String _controllerName, _actionName;
private Boolean _redirectToGenericView = false;
public ErrorLoggingAttribute()
{
}
public ErrorLoggingAttribute(String actionName, String controllerName)
{
_controllerName = controllerName;
_actionName = actionName;
_redirectToGenericView = true;
}
void IExceptionFilter.OnException(ExceptionContext ec)
{
// log error
if (_redirectToGenericView)
{
ec.Result = new RedirectToRouteResult(new RouteValueDictionary
{
{"controller", _controllerName},
{"action", _actionName}
});
}
else
{
ec.Result = new ViewResult
{
ViewName = ((RouteData) ec.RouteData).Values["action"].ToString(),
TempData = ec.Controller.TempData,
ViewData = ec.Controller.ViewData
};
}
ec.ExceptionHandled = true;
}
}
以下是如何在 Controller 操作上使用该属性,以重定向到相同的 View (与它是关联的模型)以在发生异常时启用标准验证助手:
[ErrorLogging]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Models.Entities.Message message)
{
var dc = new Models.DataContext();
dc.Messages.InsertOnSubmit(message);
dc.SubmitChanges();
return RedirectToAction("List", new { id = message.MessageId });
}
下面是发生异常时如何使用该属性重定向到通用 View :
[ErrorLogging("ControllerName", "ViewName")]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Models.Entities.Message message)
这是逻辑的完全分离。 Controller 中只有最基本的内容。
关于c# - 从 ActionFilterAttribute 返回带有模型的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1669553/
也许我误解了 ActionFilterAttribute 的要点,但我现在拥有的是以下内容: public class MyCustomAttribute : ActionFilterAttribut
我有这个自定义操作过滤器: public class PermissionChecker: ActionFilterAttribute { private int _permissionId
我做了一个自定义访问检查 ActionFilterAttribute,如果他们没有足够的访问权限,我想将其重定向到错误页面。这是我到目前为止所拥有的。 RouteValueDictionary rou
我遇到了 ActionFilterAttriute 无法正确重定向的问题。我不熟悉完整的代码库,但我已经看到了足够多的代码,不明白发生了什么。 为了简化代码,我删除了不相关的部分: public cl
我的 ActionFilter 的调用顺序有问题。 我创建了一个过滤器来设置布局 MasterName: [AttributeUsage(AttributeTargets.Method | Attri
例子 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple
我创建了一个 Action 过滤器,用于测量 Web API v2 中每个 Action 的运行时间。 public class RunningTimeAttribute : ActionFilter
我正在尝试对自定义 ActionFilterAttribute 进行单元测试。例如: public class ActionAuthorizationAttribute: ActionFilterAt
public class CheckMetadataAttribute : ActionFilterAttribute { public override void OnActionExecu
我正在实现自定义 ActionFilterAttribute,目前尚不清楚我是否需要覆盖 OnActionExecutingAsync() 方法。这是一个使用 ASP.NET WebAPI v5.
我想在 MVC2 上定义以下属性: public class BackAttribute : ActionFilterAttribute { public BackAttribute(objec
我的 Controller 有一个属性 [ABC] MyController 属性会检查一些内容,但我只想每页检查一次。 public class ABCAttribute : ActionFilt
我正在尝试理解这个 ActionFilterAttribute。我尝试稍微尝试一下代码以更好地理解它是如何工作的,但我完全迷路了。 这是有效的 ActionFilterAttribute。它应该检查空
我为我的 web api 创建了一个 ActionFilterAttribute 来授权人们。通过 RequestUri 获取 accessToken 是可以的,但是我想以表单数据的形式发送它。在 A
书面形式this answer , 有人问我是否有关于 ActionFilterAttribute 的行为的保证.我无法自信地回答。 特别是 OnActionExecuted、OnActionExec
在我的 WebAPI 项目中,我正在使用 FluentValidation。我通过添加在全局范围内启用它FluentValidationModelValidatorProvider.Configure
开始编写一个简单的过滤器来在每个 Action 加载时从请求中提取一些东西,从其他 stackoverflows 复制一些代码,如下所示: public class TestKeyAttribute
我想在 ActionFilterAttribute 中有一个字段,它只与它所在的操作相关,例如 public class TimedAction : ActionFilterAttribute
再会。 我正在尝试通过在我的自定义 ActionFilterAttribute 类中注入(inject) LoggerFactory 来使用日志记录,但是在其中一个 Controller 方法中使用
在注释的 Controller 方法上 ActionFilterAttribute哪个先发生,是 OnActionExecuting 还是 OnResulting 方法? 事情发生的顺序是什么?我已经
我是一名优秀的程序员,十分优秀!