私はCreateViewで異なるモデルを使用し、すべてBaseModelから継承します。右側のEditorForを呼び出すには、モデルと実際のプロパティを取得するHtmlHelperを作成しました。しかし、私はそれを呼び出す方法を知らない。HtmlHelperで `EditorExtensions.EditorFor`を呼び出すにはどうしたらいいですか?
BaseModel:私の見解では
public abstract class BaseModel
{
protected IEnumerable<PropertyInfo> PropertyInfoCache { get; set; }
protected IEnumerable<EnumeratedProperty> EnumeratedPropertyCache { get; set; }
protected BaseModel()
{
PropertyInfoCache = this.GetType().GetProperties();
EnumeratedPropertyCache = PropertyInfoCache.Select(p=> new EnumeratedProperty(p.Name,p.GetType()));
}
public IEnumerable<EnumeratedProperty> EnumerateProperties()
{
return EnumeratedPropertyCache;
}
public object GetPropertyValue(string PropertyName)
{
var property = PropertyInfoCache.SingleOrDefault(i=>i.Name==PropertyName);
if(property!=null)
return property.GetValue(this,null);
return null;
}
}
public class EnumeratedProperty
{
public string Name { get; private set; }
public Type Type { get; private set; }
public EnumeratedProperty(string PropertyName, Type PropertyType)
{
this.Name = PropertyName;
this.Type = PropertyType;
}
}
:
は@foreach (var property in Model.EnumerateProperties())
{
@Html.EditorForProperty(Model,property);
}
のHtmlHelper:
public static class ExtensionMethods
{
public static MvcHtmlString EditorForProperty(this HtmlHelper html, BaseModel Model, EnumeratedProperty property)
{
// creates an error: The type arguments for method 'EditorFor' cannot be inferred from the usage. Try specifying the type arguments explicitly.
return System.Web.Mvc.Html.EditorExtensions.EditorFor(html, Model => Model.GetPropertyValue(property.Name));
}
}
あなたは何をしようとしていますか?私はあなたがいくつかの車輪を再発明していることを恐れています。このBaseModelクラスを持っていることで元の意図を述べてください。 –
@ダリン・ディミトロフ私はランプを使って店をつくっていますが、私は価格などのランプと特別なパラメータを持つモデルを継承したランプのためのベースモデルを使用しています。今私は、BaseModelでCreateViewを作成し、私のパラメータをループしますが、デフォルトのEditorForは私の値を正確に再現しません。彼は型が必要です。 – jwillmer
本質的に辞書のオブジェクトリストを変換してMVCにプロパティとして認識させたいのですが... –