2017-11-03 1 views
0

Gibt es einen Filter oder einen anderen Mechanismus in ASP.NET MVC Core, wo ich die Eigenschaft und den Wert des Modells auswerten kann, bevor die Ansicht gerendert wird? Ich notiere einige Eigenschaften meines Modells, und ich muss deren Wert übersetzen, bevor das Modell in der Ansicht gerendert wird.So bewerten Sie die Eigenschaft und den Wert eines Modells vor dem Rendern Rendern

Ich habe versucht, mit dem 'IDisplayMetadataProvider' aber das funktioniert nur, wenn die Modelleigenschaften Teil eines Modellausdrucks sind. In meinem Fall sind sie nicht - sie werden oft nur für die Anzeige verwendet (wie der ViewBag.Title zum Beispiel).

Einfaches Beispiel:

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

Bevor das Modell in der Ansicht gerendert wird, muß ich das Modell und die Erkenntnis, einen Weg haben, zu inspizieren, die Eigenschaften mit Anmerkungen versehen werden mit „Übersetzen“. Wenn dies der Fall ist, dann nimm den Wert dieser Eigenschaft und ändere ihn in etwas anderes. In diesem Beispiel möchte ich den Wert der "TitleKey" -Eigenschaft abrufen, einen Übersetzungsdienst aufrufen, um diesen Wert zu übersetzen, und dann den Wert neu zuweisen, bevor er die Ansicht erreicht.

+0

Ja, möglicherweise, aber können Sie einen Ausschnitt dessen hinzufügen, was Sie versuchen zu tun? –

+0

Es gibt bereits ein empfohlenes Muster von Microsoft für [Globalisierung und Lokalisierung in ASP.NET Core] (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization) –

+0

Leider kann ich nicht Verwenden Sie die integrierte Unterstützung für die Lokalisierung. Woran ich arbeite, ist stark angepasst und verwendet keine Resx-Dateien. Zugegeben, es mag möglich sein, ein bestimmtes Verhalten zu überschreiben, damit es funktioniert, aber für den Moment brauche ich nur eine Möglichkeit, diese Eigenschaften zu bewerten, und meine Arbeit ist erledigt. –

Antwort

1

Sie können get value from custom attribute-decorated property und zu tun:

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 + " :)"; 
} 

Verbrauch:

public IActionResult Index() 
{ 
    var vm = _service.GetViewModel(); 

    vm.TitleKey = "Title.Translation.Key"; 

    Translate(vm); 
    return View(vm); 
} 

Sie selbst View außer Kraft setzen könnte Translate Methode aufzurufen.

+0

Dies funktioniert für einfache Objekte, aber es ist möglich, dass ich komplexe Objekte mit tief verschachtelten Typen haben könnte. Ich kann etwas Ähnliches mit der Asp.Net webAPI erreichen, indem ich einen kundenspezifischen json Vertrag Resolver erstelle, der leicht erlaubt, Eigenschaften aller Gegenstände zu prüfen, die durch die Rohrleitung führen. Idealerweise würde ich gerne etwas ähnliches in MVC machen. –

+0

Meine Antwort adressiert diese Frage. Bitte stellen Sie eine neue Frage, indem Sie auf die Schaltfläche [Frage stellen] (https://stackoverflow.com/questions/ask) klicken. Fügen Sie Ihren obigen Kommentar und den zugehörigen Code ein. Fügen Sie einen Link zu dieser Frage hinzu, wenn es hilft, Kontext bereitzustellen. – aaron

1

die Antwort vielleicht nicht genau das, was Sie suchen, aber ich glaube, Sie

Action filters

Sie geben Ihnen zwei Methoden, um einen Blick auf Aktionsfilter in aspnet Kern nehmen wollen:

  1. OnActionExecuting

  2. OnActionExecuted

Aus Ihrer Beschreibung sieht aus, als ob Sie die Eingabe zu OnActionExecuted manipulieren möchten. Sie müssen dies richtig testen, da Aktionsfilter möglicherweise nicht aufgerufen werden, falls ein anderer Filter die Pipeline kurzschließen sollte oder wenn die Antwort bereits begonnen hat.

Verwandte Themen