Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何评估模型';视图渲染前的属性和值_C#_Asp.net Mvc_Asp.net Core Mvc - Fatal编程技术网

C# 如何评估模型';视图渲染前的属性和值

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

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);
  }
}

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

答案可能与您想要的不完全一样,但是,我认为您需要查看aspnet core中的操作过滤器

它们提供了两种方法:

  • OnActionExecuting

  • 已执行的操作


  • 从您的描述来看,您似乎希望操作OnActionExecuted的输入。您需要对此进行适当的测试,因为如果其他筛选器决定使管道短路,或者响应已经启动,则可能不会调用操作筛选器

    答案可能并不完全是您想要的,但是,我想您应该看看aspnet core中的操作过滤器

    它们提供了两种方法:

  • OnActionExecuting

  • 已执行的操作

  • 从您的描述来看,您似乎希望操作OnActionExecuted的输入。您需要对此进行适当的测试,因为如果其他筛选器决定使管道短路,或者响应已经启动,则可能不会调用操作筛选器

    你可以并且做:

    用法:

    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中做一些类似的事情。我的答案解决了这个问题。请单击按钮提出新问题。包括您的上述评论和相关代码。如果此问题有助于提供上下文,请包含指向此问题的链接。