ASP.NET MVC Core中是否有过滤器或其他机制,我可以在呈现View之前评估模型的属性和值?我正在注释我的模型的一些属性,我需要在模型在视图中呈现之前转换它们的值。
我尝试使用'IDisplayMetadataProvider'但这仅在模型属性是模型表达式的一部分时才有效。就我而言,它们不是 - 它们通常仅用于显示目的(例如ViewBag.Title)。
简单示例:
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);
}
}
在View中渲染模型之前,我需要有一些检查模型的方法,并找到使用“Translate”注释的属性。如果是,则获取该属性的值并将其更改为其他属性。在这个例子中,我想获取“TitleKey”属性的值,调用翻译服务来翻译该值,然后在它到达View之前重新分配该值。
答案 0 :(得分:1)
答案可能不完全是你想要的,但是,我想你想看一下aspnet核心中的动作过滤器
他们为您提供了两种方法:
OnActionExecuting
OnActionExecuted
从您的描述中看起来您想要操作OnActionExecuted的输入。您需要对此进行正确测试,因为如果某些其他过滤器决定使管道短路或响应已经开始,则可能无法调用操作过滤器。
答案 1 :(得分:1)
您可以get value from custom attribute-decorated property并执行:
private void Translate(object o)
{
var t = o.GetType();
var props = t.GetProperties();
foreach (var prop in props)
{
var propattr = prop.GetCustomAttributes(false);
var shouldTranslate = propattr.Any(row => row.GetType() == typeof(TranslateAttribute));
if (shouldTranslate)
{
var value = (string)prop.GetValue(o, null);
if (value != null)
{
prop.SetValue(o, MyTranslationService(value));
}
}
}
}
private String MyTranslationService(String s)
{
return s + " :)";
}
用法:
public IActionResult Index()
{
var vm = _service.GetViewModel();
vm.TitleKey = "Title.Translation.Key";
Translate(vm);
return View(vm);
}
您甚至可以覆盖View
来调用Translate
方法。