2013. 9. 17. 15:00

이전 글에서 뷰 엔진에서 모델의 특정 속성을 가지고 오는 방법을 알려 드렸습니다.

(참고 : [Asp.net MVC 4] 뷰 엔진에서 모델(Model)의 속성(Attribute) 표시하기 )

그런데 'HtmlHelper'는 컨트롤러에서 사용할 수 없다고 했습니다.

결국 컨트롤러에서 해당 메서드를 사용하고 싶다면 'HtmlHelper'를 빼고 동작하는 메서드가 있어야 합니다.

 

 

1. 확장메서드 복습하기

 

전글에서 사용한 코드를 다시한번 보죠.

 

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. 문제 해결

 

이 문제를 간단하게 해결하려면 그냥 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;
}

 

오호

됩니다.

 

 

3. 사용하기

이렇게 만든 확장메서드는 '[네임스페이스].[확장 메서드용 클래스 이름]'의 경로에 붙게 됩니다.

전 이전글에서 처럼 '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