6

エディター用の HTML ヘルパーを作成しています。アイデアは、属性 AutoGenerateField を使用してモデルからプロパティを取得し、テーブルを作成することです。テーブルの各行には、フィールドの名前 (属性からも) と、フィールドの実際の値を含む TextBox または CheckBox が含まれます。

HTMLHelper に問題があります。1 つの値ではなくモデル全体をヘルパーに送信するため、次のようなパラメーターが必要なため、TextBoxFor などのメソッドを使用できません。

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

私は反射を使用しており、代わりにプロパティを送信しようとしましたが、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);
}

何か案は?

4

1 に答える 1

2

非ラムダオーバーロードを使用するのはどうですか。: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...

関数のラムダバージョンを使用する場合でも、フォーム要素のname属性がプロパティ名に設定されているので、これは同じことを行うはずです。

ラムダ関数が何をするのかを検証してみTModelます。


アップデート

InputExtensions.csのソース コード内をざっと見てみると、 TextBoxFor呼び出しは、最終InputHelper()的にExpressionHelper.csExpressionHelper.GetExpressionText(LambdaExpression expression)内で呼び出す呼び出しを呼び出します。member.Name

私はWindowsを使用していないため、今は完全に確認できませんが、非ラムダ関数がニーズに合っていると思います。それがどうなるか教えてください。

于 2013-04-19T16:05:21.257 に答える