C# 如何评估模型';视图渲染前的属性和值
ASP.NET MVC Core中是否有一个过滤器或其他机制,可以在呈现视图之前评估模型的属性和值?我正在注释模型的一些属性,需要在视图中渲染模型之前转换它们的值 我尝试使用“IDisplayMetadataProvider”,但这仅在模型属性是模型表达式的一部分时有效。在我的例子中,它们不是——它们通常仅用于显示目的(例如ViewBag.Title) 简单的例子:C# 如何评估模型';视图渲染前的属性和值,c#,asp.net-mvc,asp.net-core-mvc,C#,Asp.net Mvc,Asp.net Core Mvc,ASP.NET MVC Core中是否有一个过滤器或其他机制,可以在呈现视图之前评估模型的属性和值?我正在注释模型的一些属性,需要在视图中渲染模型之前转换它们的值 我尝试使用“IDisplayMetadataProvider”,但这仅在模型属性是模型表达式的一部分时有效。在我的例子中,它们不是——它们通常仅用于显示目的(例如ViewBag.Title) 简单的例子: public class MyModel { [Translate] public string TitleKey { g
public class MyModel
{
[Translate]
public string TitleKey { get; set; }
public string SomeOtherProp {get;set;}
public int AnotherProp {get;set;}
}
public class MyController
{
[HttpGet]
public IActionResult Index()
{
var vm = _service.GetViewModel();
vm.TitleKey = "Title.Translation.Key";
return View(vm);
}
}
在视图中渲染模型之前,我需要有一些方法来检查模型并找到用“Translate”注释的属性。如果是,则获取该属性的值并将其更改为其他值。在本例中,我希望获取“TitleKey”属性的值,调用翻译服务来翻译该值,然后在该值进入视图之前重新分配该值。答案可能与您想要的不完全一样,但是,我认为您需要查看aspnet core中的操作过滤器 它们提供了两种方法:
从您的描述来看,您似乎希望操作OnActionExecuted的输入。您需要对此进行适当的测试,因为如果其他筛选器决定使管道短路,或者响应已经启动,则可能不会调用操作筛选器 答案可能并不完全是您想要的,但是,我想您应该看看aspnet core中的操作过滤器 它们提供了两种方法:
public IActionResult Index()
{
var vm = _service.GetViewModel();
vm.TitleKey = "Title.Translation.Key";
Translate(vm);
return View(vm);
}
您甚至可以覆盖View
来调用Translate
方法。您可以并执行以下操作:
用法:
public IActionResult Index()
{
var vm = _service.GetViewModel();
vm.TitleKey = "Title.Translation.Key";
Translate(vm);
return View(vm);
}
您甚至可以覆盖
View
来调用Translate
方法。可能是的,但是您可以包含一段您正在尝试执行的操作吗?Microsoft已经推荐了一种模式,很遗憾,我无法使用内置的本地化支持。我使用的是高度定制的,不使用resx文件。诚然,可以重写某些行为以使其正常工作,但目前,我真正需要的是一种评估这些属性的方法,我的工作就完成了。是的,但您是否可以包含您尝试执行的操作的一部分?Microsoft已经为我推荐了一种模式,我不能使用内置的本地化支持。我使用的是高度定制的,不使用resx文件。诚然,可以重写某些行为使其工作,但现在,我真正需要的是一种方法来评估这些属性,我的工作就完成了。这对简单对象有效,但也可能有嵌套类型很深的复杂对象。我可以通过创建一个自定义json契约解析器来实现与Asp.NETWebAPI类似的功能,该解析器可以轻松地检查通过管道的所有对象的属性。理想情况下,我想在MVC中做一些类似的事情。我的答案解决了这个问题。请单击按钮提出新问题。包括您的上述评论和相关代码。如果有助于提供上下文,请包含指向此问题的链接。这将适用于简单对象,但也可能有嵌套类型较深的复杂对象。我可以通过创建一个自定义json契约解析器来实现与Asp.NETWebAPI类似的功能,该解析器可以轻松地检查通过管道的所有对象的属性。理想情况下,我想在MVC中做一些类似的事情。我的答案解决了这个问题。请单击按钮提出新问题。包括您的上述评论和相关代码。如果此问题有助于提供上下文,请包含指向此问题的链接。