2013-04-19 14 views
6

エディタ用のHTMLヘルパを作成しています。このアイデアは、AutoGenerateFieldという属性を持つモデルからプロパティを取得し、各行に(属性からの)フィールドの名前と、フィールドの実際の値を含むTextBoxまたはCheckBoxを含むテーブルを構築することです。HTMLHelper、 "Expression <Func <TModel、TValue >> expression"の型のパラメータを生成します

HTMLHelperに問題があります。私はヘルパーではなく1つの値にモデル全体を送っているので、私は彼らがそのような

"Expression<Func<TModel, TValue>> expression". 

などのパラメータを、必要として、私は反射を利用していると私が代わりにプロパティを送信しようとした、などTextBoxForなどのメソッドを使用することはできませんそれでもVisualStudioはこれを誤った使用とみなします。以下は

は私のHtmlHelperのための方法を簡略化されている:

public static MvcHtmlString GenerateEditor<TModel>(this HtmlHelper<TModel> htmlHelper) 
{ 
    var model = htmlHelper.ViewData.Model; 
    var result = String.Empty; 

    //generating container, etc ... 

    foreach (var property in model.GetType().GetProperties()) 
    { 
     var attr = property.GetCustomAttributes(typeof (DisplayAttribute), true).FirstOrDefault(); 
     if (attr == null) continue; 
     var autoGenerate = ((DisplayAttribute)attr).AutoGenerateField; 
     if(autoGenerate) 
     { 
      //here I'm building the html string 
      //My problem is in the line below: 
      var r = htmlHelper.TextBoxFor(property); 
     } 
    } 
    return MvcHtmlString.Create(result); 
} 

任意のアイデア?

答えて

2

非ラムダオーバーロードを使用するのはどうでしょうか。 :私はあなたがそう、これは同じことを行う必要がある機能のラムダバージョンを使用する場合でも、プロパティ名に設定されているフォーム要素のname属性を間違っていない場合はInputExtensions.TextBox()

if(autoGenerate) 
{ 
    //here I'm building the html string 
    //My problem is in the line below: 
    var r = htmlHelper.TextBox(property.Name); 
} 
//not sure what you do with r from here... 

私はラムダ機能が何をしているかを検証しようとしますが、TModelがあるので同じことをすることができます。


更新

InputExtensions.csのソースコード内の物事の簡単に見から、TextBoxForは最終的に物事の一遍ルックスからmember.Nameを取得したExpressionHelper.csExpressionHelper.GetExpressionText(LambdaExpression expression)を呼び出すInputHelper()を呼び出し、最終的に呼び出し、 input要素のhtml属性の名前です。

私は窓にはないので、今確かめることはできませんが、非λ関数があなたの必要性に合っていると思います。それがどうなるか教えてください。

+0

ありがとうございます!それはうまくいった! – Anelook

+0

@Annelookようこそ) – gideon

関連する問題