이전 글에서 뷰 엔진에서 모델의 특정 속성을 가지고 오는 방법을 알려 드렸습니다.
(참고 : [Asp.net MVC 4] 뷰 엔진에서 모델(Model)의 속성(Attribute) 표시하기 )
그런데 'HtmlHelper'는 컨트롤러에서 사용할 수 없다고 했습니다.
결국 컨트롤러에서 해당 메서드를 사용하고 싶다면 'HtmlHelper'를 빼고 동작하는 메서드가 있어야 합니다.
전글에서 사용한 코드를 다시한번 보죠.
using System.Linq.Expressions; namespace System.Web.Mvc.Html { public static class DisplayDescriptionExtensions { public static string GetDescription<TModel, TProperty>(this HtmlHelper html, TModel model, Expression<Func<TModel, TProperty>> expression) { return ModelMetadata.FromLambdaExpression<TModel, TProperty> (expression , new ViewDataDictionary<TModel>(model) ).Description; } } }
잘모시면 아시겠지만 'HtmlHelper'은 확장메서드를 위해서 있는 파라메타일뿐 다른 역활은 하지 않습니다.
'HtmlHelper'를 빼도 동작하는데 지장이 없다는 뜻이죠.
그러면 단순히 'HtmlHelper'만 빼면 되느냐?
그건 또 안되는 것이 확장 메서드는 무조건 원본이 있어야 합니다.
이 문제를 간단하게 해결하려면 그냥 2번째 파라메타에 'this'를 넣고 테스트 해보는 것입니다.
public static string GetDescription<TModel, TProperty> (this TModel model , ExpressionFunc<TModel, TProperty>> expression) { return ModelMetadata.FromLambdaExpression<TModel, TProperty> (expression , new ViewDataDictionary<TModel>(model) ).Description; }
오호
됩니다.
이렇게 만든 확장메서드는 '[네임스페이스].[확장 메서드용 클래스 이름]'의 경로에 붙게 됩니다.
전 이전글에서 처럼 'System.Web.Mvc.Html'에서 확장메서드를 만들었기 때문에 'System.Web.Mvc.Html.DisplayDescriptionExtensions'에서 사용해야 합니다.
string aaa = System.Web.Mvc.Html.DisplayDescriptionExtensions.GetDescription( model, model2 => model2.Word);
코드 라인끝
이제 'aaa'에 우리가 원하는 값이 들어갔는지 확인해 봅시다.
우왕굳
참고 :
스텍오버플로 - Get [DisplayName] attribute of a property in strongly-typed way