【问题标题】:How to evaluate a model's property and value prior to View render如何在视图渲染之前评估模型的属性和值
【发布时间】:2017-11-07 23:59:01
【问题描述】:

在 ASP.NET MVC Core 中是否有过滤器或其他机制,我可以在呈现视图之前评估模型的属性和值?我正在注释我的模型的一些属性,我需要在模型在视图中呈现之前翻译它们的值。

我尝试使用“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);
  }
}

在视图中渲染模型之前,我需要有一些方法来检查模型并找出哪些属性带有“翻译”注释。如果是,则获取该属性的值并将其更改为其他值。在此示例中,我想获取“TitleKey”属性的值,调用翻译服务来翻译该值,然后在该值到达视图之前重新分配该值。

【问题讨论】:

  • 可能是的,但您能否包含您正在尝试做的事情的 sn-p?
  • 微软已经推荐了Globalization and localization in ASP.NET Core的模式
  • 很遗憾,我无法使用内置的本地化支持。我正在使用的是高度定制的,不使用 resx 文件。诚然,可以覆盖某些行为以使其工作,但现在,我真正需要的只是一种评估这些属性的方法,我的工作就完成了。

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


【解决方案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 方法。

【讨论】:

  • 这适用于简单的对象,但我可能会拥有具有深度嵌套类型的复杂对象。我可以通过创建自定义 json 合同解析器来实现与 Asp.Net webAPI 类似的事情,该解析器可以轻松检查通过管道的所有对象的属性。理想情况下,我想在 MVC 中做类似的事情。
  • 我的回答解决了这个问题。请点击 按钮提出新问题。包括您上面的评论和相关代码。如果有助于提供上下文,请包含指向此问题的链接。
【解决方案2】:

答案可能不是您要找的,但是,我想您想看看 aspnet 核心中的操作过滤器

Action filters

他们给你两种方法:

  1. OnActionExecuting

  2. OnActionExecuted

根据您的描述,您似乎想操作 OnActionExecuted 的输入。您需要对此进行正确测试,因为如果其他过滤器决定使管道短路或响应已经开始,则可能不会调用操作过滤器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-22
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2014-04-27
    相关资源
    最近更新 更多