2011-06-30 23 views
0

我在我的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)); 
    } 
} 
+0

你想做什麼?我擔心你正在重塑一些車輪。你可以說出你有這個BaseModel類的原意嗎? –

+0

@Darin Dimitrov我正在創建一個商店,可以說燈具,我用價格等燈具的基礎模型和一些特殊參數的繼承模型。現在我已經用BaseModel創建了一個CreateView並循環了我的參數,但是默認的EditorFor沒有正確記錄我的值,他需要這個類型。 – jwillmer

+0

所以基本上你想轉換字典中的對象列表以獲得MVC將它們識別爲屬性... –

回答

0

EditorFor識別對象的類型,所以你會想要做的是提取物類型來自EnumeratedProperty類中的值,而不是直接傳遞類,並傳遞給t他也很看重它。

+0

是的,這就是它,但我已經試過它沒有成功:-( – jwillmer

+0

您的代碼上面有html ..?編輯擴展名的地方......你試過了什麼?你可以發佈一個樣本嗎? –

+0

編輯我的帖子與我嘗試調用方法,但我不知道如何定義在這種方法中的類型明確:-( – jwillmer

相關問題