2009-10-05 3 views
0

Asp.net MVC 용으로 매우 강력한 형식의 & 유형 안전 프로젝트를 빌드해야하기 때문에. 그러나보기 페이지에서 많은 구문이 유형에 안전한 변수가 아니라는 사실을 발견했습니다. 다음 예제를 살펴보십시오. 대신속성과 같은 메서드를 참조 할 수 있습니까? Validate (x => x.Property)

Form.BeginForm(x => Account.LogOn) 

BeginForm("LogOn", "Account") 

그것은 위의 코드 같은 것을 만들 수 있습니까? 강력한 형식의 소스 코드입니다.

업데이트!

표현식 트리에서는 불가능하다는 것을 알았습니다. 다음 코드를 살펴보십시오.

동작이 하나만있는 컨트롤러 클래스입니다. 공용 클래스 Controller1 { public보기 Action1() { return null; } }

표현 코드를 확인하십시오.

Expression<Action<Controller1>> exp1 = (c => c.Action1()); 

Expression part = exp1.Body; 

if (part.NodeType == System.Linq.Expressions.ExpressionType.Call) 
{ 
    MethodCallExpression callExpression = (MethodCallExpression)part; 

    MessageBox.Show(callExpression.Method.DeclaringType.Name + " : " + callExpression.Method.Name); 
} 

결과는 "Controller1 : Action1"입니다.

업데이트 2!

다음 코드는 강력한 형식의 시작 양식의 최종 코드입니다.

public static MvcForm BeginForm<BaseController>(this HtmlHelper htmlHelper, Expression<Action<BaseController>> routeExp) 
{ 
    Expression part = routeExp.Body; 

    if (part.NodeType == System.Linq.Expressions.ExpressionType.Call) 
    { 
     MethodCallExpression callExpression = (MethodCallExpression)part; 
     MethodInfo actionMethod = callExpression.Method; 

     return htmlHelper.BeginForm(actionMethod.Name, actionMethod.DeclaringType.Name); 
    } 

    throw new Exception(); 
} 

따라서 다음 패턴을 사용하여 호출 할 수 있습니다.

<% Html.BeginForm<HomeController>(x => x.Index()); %> 

덕분에,

답변

0

람다 표현식은 이제 가능하지만이 경우에는 도움이되지 않습니다. 자 여러분의 예제를 살펴 보겠습니다. BeginForm 메소드는 두 개의 문자열을 입력으로 사용하며 람다 표현식을 사용하지 않아도됩니다.

이러한 문자열을 하나 이상의 클래스에 대한 속성으로 캡슐화 할 수는 있지만 그 이유는 유형 안전이 아니기 때문입니다.

철자가 틀릴 위험을 줄이기 위해 모든 문자열을 중앙 위치로 이동하는 데 약간 도움이 될 수 있지만 여전히 문자열입니다.

+0

당신이 말한대로, 나는 다만 시도한다. 이 문제를 해결할 수있는 헬퍼 클래스를 만들 수 있습니다. 감사! –

0

MVC 선물이

같은 당신은

경고 '수동'으로도 소스 코드를 asp.net/mvc 또는 codeplex에서 다운로드받을 수 있습니다 지원 '미래'상품이므로 향후 출시 될 때 변경 될 수 있습니다.