2011-07-03 8 views
4

私はMVCはHtml.DisplayFor方法でラムダ関数から渡された変数の名前を見つけていることを参照してください。それは明らかであるmvc HtmlHelper DisplayFor関数はどのようにラムダ関数から完全なプロパティパスを抽出しますか?

<input id="myModel_propA_propB" type="hidden" value="" > 

:よう

@Html.HiddenFor(model => myModel.propA.propB) 

は、HTMLの何かを生成することがありました反射を使用して、それは私を超えています。誰かが私を埋めることができますか?

同様に、ラムダ関数の代わりに完全なプロパティ参照をとるHTMLヘルパ関数を作成することは可能ですか?すなわち、

@Html.HiddenFor(myModel.propA.propB) 

...とヘルパーがいっぱい「myModel.propA.propB」を参照していないpropBの値だけを渡すことができますか?この種類のタスクを達成するためのラムダ関数である奇妙なネットの回避策であるか、実際にはすべてのプログラミング分野にわたって好ましいアプローチです。

答えて

6

実際には、プロパティ名を取得するためにヘルパーメソッドに渡す式ツリーをトラバースしています。 - 例えば、あなたは複数のプロパティの呼び出しは、渡された式であるとき、式のチェーンを歩かなければならないでしょう、あなたが考え

完成されていません。もちろん、
MemberExpression memberExpression = (MemberExpression) expression.Body; 
propertyName = memberExpression.Member.Name; 

:実際には、次のようになりますMemberExpressionなどで渡される他の式の型を考慮する必要がありますが、あなたはその考えを得ます。式はデータとして表現されるコード式であることに注意してください。また、MVCはオープンソースなので、必要に応じて、ソース内のHTML名に到達するために使用するコードを調べることができます。

2番目の質問に答えるには、答えはいいえです。ラムダなしで( "Expression<Func<T,object>>"になる) "ちょうどプロパティ"を渡すと、関数は渡された値しか見ることができず、呼び出しコードがその値にどのように到着したかについては何もわからないので動作しません。

関連する問題