如何在View渲染之前评估模型的属性和值

时间:2017-11-03 19:39:19

标签: c# asp.net-mvc asp.net-core-mvc

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之前重新分配该值。

2 个答案:

答案 0 :(得分:1)

答案可能不完全是你想要的,但是,我想你想看一下aspnet核心中的动作过滤器

Action filters

他们为您提供了两种方法:

  1. OnActionExecuting

  2. OnActionExecuted

  3. 从您的描述中看起来您想要操作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方法。