誰かが私のために何かを明確にしてください。 ASP.NET MVC 2アプリには、次のメソッドを含むBaseViewModel
クラスがあります。
public virtual IDictionary<string, object> GetHtmlAttributes<TModel, TProperty>
(Expression<Func<TModel, TProperty>> propertyExpression)
{
return new Dictionary<string, object>();
}
各子ビューモデルはこのメソッドをオーバーライドし、いくつかのロジックに基づいてビューにレンダリングされるHTML属性の適切なセットを提供できるという考え方です。
<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes
(model => model.MyProperty)) %>
ただし、上記の行のように使用すると、ビューにアクセスしたときにコンパイルエラーが発生します。
メソッド '
...BaseViewModel.GetHtmlAttributes<TModel,TProperty> Expression<System.Func<TModel,TProperty>)
'の型引数は、使用法から推測できません。型引数を明示的に指定してみてください。
私は次のことをしなければなりません:
<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes
<ChildModel, string>(model => model.MyProperty)) %>
型を推測しようとする方法について明確なものを探していますが、HtmlHelper/TextBoxFor
拡張メソッドで問題なく推測できますか?
これは、ビューのHtmlHelper
がページ上部のViewUserControl
で指定されているのと同じタイプに自動的に対応するのに対して、私のコードはBaseViewModel
?モデル/プロパティタイプを推測できるような方法でこれを記述することは可能ですか?
あなたの例では、コンパイラはどの型がTModel
であるべきかを知る方法がありません。拡張メソッドを使用しておそらくしようとしていることに近い何かを行うことができます。
static class ModelExtensions
{
public static IDictionary<string, object> GetHtmlAttributes<TModel, TProperty>
(this TModel model, Expression<Func<TModel, TProperty>> propertyExpression)
{
return new Dictionary<string, object>();
}
}
しかし、あなたはvirtual
に似たものを持つことはできないと思います。
編集:
実際、自己参照ジェネリックを使用してvirtual
を実行できます。
class ModelBase<TModel>
{
public virtual IDictionary<string, object> GetHtmlAttributes<TProperty>
(Expression<Func<TModel, TProperty>> propertyExpression)
{
return new Dictionary<string, object>();
}
}
class FooModel : ModelBase<FooModel>
{
public override IDictionary<string, object> GetHtmlAttributes<TProperty>
(Expression<Func<FooModel, TProperty>> propertyExpression)
{
return new Dictionary<string, object> { { "foo", "bar" } };
}
}
この質問にはすでに受け入れられた答えがありますが、.NET初心者の私にとっては、間違っていたことに対する簡単な解決策があり、共有したいと思いました。
私はこれをやっていた:
@Html.HiddenFor(Model.Foo.Bar.ID)
私のために働いたのはこれに変わっていました:
@Html.HiddenFor(m => m.Foo.Bar.ID)
(「m」はモデルオブジェクトを表す任意の文字列です)
私はこれと同じ問題を抱えていました、私の解決策:
web.configファイル内:
<compilation debug="true>
に変更する必要がありました<compilation debug="true" targetFramework="4.0">
このエラーはcacheの問題とも関連しています。
私は同じ問題を抱えていましたが、cleaningとbuildingの解決策をもう一度解決しました。
C#コンパイラにはラムダのみがあります
arg => arg.MyProperty
arg(TModel)の推論型の場合、arg.MyProperty(TProperty)の型。それは不可能だ。
それが役立つ場合は、null
を汎用TValue
のパラメーターに渡すときにこの問題に遭遇しました。これを回避するには、null値をキャストする必要があります。
(string)null
(int)null
等.