2017-11-03 5 views
0

렌더링보기 평가하기? 내 모델의 일부 속성에 주석을 달고 있으며 모델이 뷰에 렌더링되기 전에 값을 변환해야합니다. 어떻게 모델의 특성과 이전 값이 필터 또는보기가 렌더링되기 전에 내가 모델의 특성과 가치를 평가할 수 ASP.NET MVC 코어에서 다른 메커니즘이

은 내가 '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"속성의 값을 가져오고 해당 값을 변환하는 번역 서비스를 호출 한 다음 해당 값이보기에 도달하기 전에 다시 지정하려고합니다.

+0

예, 가능하지만 할 일의 스 니펫을 포함 할 수 있습니까? –

+0

[ASP.NET 코어의 세계화 및 현지화] (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization)에 대한 Microsoft의 권장 패턴이 이미 있습니다. –

+0

불행히도, 현지화를위한 기본 제공 지원을 사용하십시오. 내가하고있는 일은 고도로 맞춤화되어 있고 resx 파일을 사용하지 않는다. 허락 해 주면, 어떤 행동을 무효로하는 것이 가능할 수도 있지만, 지금 당장은 정말로 필요한 것은 그러한 속성을 평가하는 방법이며 내 일은 끝났습니다. –

답변

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 메소드를 호출 할 수 있습니다.

+0

이것은 간단한 개체에 대해서는 작동하지만 심하게 중첩 된 유형의 복잡한 개체를 가질 수 있습니다. 파이프 라인을 통과하는 모든 객체의 속성을 쉽게 검사 할 수있는 사용자 정의 JSON 계약 해결자를 작성하여 Asp.Net webAPI와 비슷한 것을 얻을 수 있습니다. 이상적으로 MVC에서 비슷한 것을하고 싶습니다. –

+0

내 대답은이 질문을 다룹니다. [Ask Question] (https://stackoverflow.com/questions/ask) 버튼을 클릭하여 새 질문을하십시오. 위의 사용자 의견 및 관련 코드를 포함하십시오. 컨텍스트를 제공하는 데 도움이되는 경우이 질문에 대한 링크를 포함하십시오. – aaron

1

대답은 당신이 찾고있는,하지만, 난 당신이 그들은 당신에게이 방법을 제공

Action filters

ASPNET 코어 액션 필터에서 살펴 봐야 할 생각을 정확히 일치하지 않을 수 있습니다

  1. OnActionExecuting

  2. 를 OnActionExecuted 당신이 OnActionExecuted의 입력을 조작하고 싶은처럼 설명에서

보인다. 다른 필터가 파이프 라인을 단락 시키거나 응답이 이미 시작된 경우를 대비하여 Action Filters가 호출되지 않을 수 있으므로이 테스트를 올바르게 수행해야합니다.