- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试创建一个自定义 ActionFilter,它将在执行操作结果之前运行。此属性将获取存储在 TempData 中的错误信息,并将其插入到主强类型模型中的子模型 (ErrorModel) 中。但是,我希望能够将其应用于使用不同模型类型的操作,这些模型类型都包含错误子模型。出于这个原因,我不能/不想将过滤器绑定(bind)到特定的 ViewModel。
如果相关,ErrorModel 是一个 IEnumerable
这是我第一次使用 ActionFilters,所以我觉得我是在黑暗中拍摄。对反射也很陌生。我有一种感觉,秘诀就是适本地导航。
使用如下所示的代码,我在最后一行收到错误:
Exception Details: System.Reflection.TargetException: Object does not match target type.
如何使用 ActionFilter 将值插入到在各种模型之间共享的子模型中?或者有更好的方法吗?
public class SetErrorModelAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
var model = filterContext.Controller.ViewData.Model.GetType();
var errorModel = model.GetProperty("ErrorModel");
errorModel.SetValue(errorModel, filterContext.Controller.TempData["Errors"] as IEnumerable<ErrorViewModel>);
}
}
最佳答案
你本质上拥有的是
Type model = filterContext.Controller.ViewData.Model.GetType();
PropertyInfo errorModel = model.GetProperty("ErrorModel");
errorModel = tempData as IEnumerable<ErrorViewModel>
Exception Details: System.Reflection.TargetException: Object does not match target type
但是你可以跳过Reflection。您可以为您的 View 模型使用通用接口(interface),并确保您的 View 模型实现该接口(interface)。
public interface IErrorViewModel
{
IEnumerable<ErrorViewModel> Errors { get; set; }
}
public MyViewModel : IErrorViewModel
{
public string Name { get; set; }
public IEnumerable<ErrorViewModel> Errors { get; set; }
}
public class SetErrorModelAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
IErrorViewModel model = filterContext.Controller.ViewData.Model as IErrorViewModel;
model.Errors = filterContext.Controller.TempData["Errors"] as IEnumerable<ErrorViewModel>;
}
}
和用法
public class HomeController : Controller
{
public ActionResult Index()
{
TempData["Errors"] = new List<ErrorViewModel>
{
new ErrorViewModel { ErrorDescription = "Not enough cowbell" },
new ErrorViewModel { ErrorDescription = "Too much cowbell" }
};
return RedirectToAction("Error");
}
[SetErrorModel]
public ActionResult Error()
{
return View("Index", new MyViewModel { Name = "Cowbell" });
}
}
关于c# - 如何从 OnResultExecuting 设置子模型内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38130026/
我正在创建一个自定义 ActionFilterAttribute为了转型ViewResult s 并重定向到 JsonResult s 在 ajax 请求期间。我已经通过单元测试连接了大部分内容,出于
我正在尝试创建一个自定义 ActionFilter,它将在执行操作结果之前运行。此属性将获取存储在 TempData 中的错误信息,并将其插入到主强类型模型中的子模型 (ErrorModel) 中。但
OnActionExecuted 和 OnResultExecuting 有什么区别?一旦处理完 Action ,它们会立即被解雇,还是在这两种方法之间发生某些事情。就像 View 引擎的初始化一样,
我有一个“无 session ” Controller ,其操作返回 JsonResult。我的客户端 Javascript 使用 Jquery ajax 通过 HTTP GET 调用此操作 [Htt
我有一个应用了属性的 Controller 操作,如果 ModelState 有错误,它会将它们设置为 OnResultExecuting 方法中的 JsonResult。 我在 MyAction 中
我有一个全局 NoCache 过滤器,如下所示:https://stackoverflow.com/a/12964123/78739 这个全局无缓存过滤器适用于所有操作。我有一个案例,我需要允许使用
简单的问题。如何覆盖 Controller 中的 OnResultExecuting 方法并强制使用不同的 ActionResult? 示例代码如下。目前,原始的 ActionResutl 继续执行,
我需要仅过滤 Controller 操作中具有返回类型 ActionResult 的所有操作中的方法。我从以下获取 Controller 名称和操作名称.. string originControll
这个问题在这里已经有了答案: How to disable a global filter in ASP.Net MVC selectively (7 个答案) 关闭 4 年前。 我正在开发一个 M
我正在寻找 OnActionExecuting 之间的比较和 OnResultExecuting . 什么时候应该与 OnActionExecuting 一起工作,以及与 OnResultExecut
ASP.NET MVC:在ActionFilterAttribute类中,OnActionExecuted和OnResultExecuted有什么区别?实现压缩过滤器时,压缩代码应该放在哪些方法中?
我是一名优秀的程序员,十分优秀!