2014-01-24 86 views
7

我有以下的HTML辅助方法:与通用paramerter转换静态方法泛型类

public static MvcHtmlString CustomEditorFor<TModel, TProperty>(this HtmlHelper<TModel> helper, 
     Expression<Func<TModel, TProperty>> expression, 
     EditorOptions options, 
     object htmlAttributes) 
{ 
} 

我有必要把它移到到一个辅助库,以这种方式构成:

public class HtmlHelperExenion 
{ 
    public static Custom(this HtmlHelper helper) 
    { 
     return new HelperFactory(helper); 
    } 
} 

public class HelperFactory 
{ 
    internal HtmlHelper HtmlHelper { get; set; } 
    public HelperFactory(HtmlHelper htmlHelper) 
    { 
     this.HtmlHelper = htmlHelper; 
    } 

    public virtual EditorBuilder CustomEditorFor(parameters from static MvcHtmlString static method above go here) 
    { 
     return new EditorBuilder(parameters go here); 
    } 
} 

我无法弄清楚如何构建我的HelperFactory类和EditorBuilder类构造函数来正确处理泛型。

这是我尝试过,并没有奏效:

public static HelperFactory<TModel, TProperty> Custom<TModel, TProperty>(this HtmlHelper<TModel> helper) 
{ 
    return new HelperFactory<TModel, TProperty>(helper); 
} 

public class HelperFactory<TModel, TProperty> : HelperFactory 
{ 
    public HtmlHelper<TModel> HtmlHelper { get; set; } 

    public HelperFactory(HtmlHelper<TModel> htmlHelper) 
     : base((HtmlHelper)htmlHelper) 
    { 
     this.HtmlHelper = htmlHelper; 
    } 

    public virtual EditorBuilder<TModel, TProperty> CustomEditorFor(Expression<Func<TModel, TProperty>> expression, 
EditorOptions options, 
object htmlAttributes) 
    { 
     return new EditorBuilder<TModel, TProperty>(this.HtmlHelper, 
        expression, 
        options, 
        htmlAttributes); 
    } 
} 

public class EditorBuilder<TModel, TProperty> 
{ 
    public EditorBuilder(HtmlHelper<TModel> helper, 
     Expression<Func<TModel, TProperty>> expression, 
     EditorOptions options, 
     object htmlAttributes) 
    { 

    } 

} 

的最终目标是能够以这种方式使用它: @ Html.Custom()CustomEditorFor(型号=> model.Property)

任何援助将不胜感激。

回答

1

你并不遥远,只是改变你的HelperFactory采取TModel这样你就可以把它绑通用HtmlHelper,并CustomEditorFor通用的,因此它可以接受任何TProperty

public class HelperFactory<TModel> 
{ 
    public HelperFactory(HtmlHelper<TModel> htmlHelper) 
    { 
     this.HtmlHelper = htmlHelper; 
    } 

    public HtmlHelper<TModel> HtmlHelper { get; private set; } 

    public virtual EditorBuilder<TModel, TProperty> CustomEditorFor<TProperty>(Expression<Func<TModel, TProperty>> expression, EditorOptions options, object htmlAttributes) 
    { 
     return new EditorBuilder<TModel, TProperty>(this.HtmlHelper, 
        expression, 
        options, 
        htmlAttributes); 
    } 
} 

然后,所有你需要做的被更新扩展方法

public static class HtmlHelperExt 
{ 
    public static HelperFactory<TModel> Custom<TModel>(this HtmlHelper<TModel> helper) 
    { 
     return new HelperFactory<TModel>(helper); 
    } 
} 

所以对于像

public class MyModel 
{ 
    public int Id { get; set; } 
    ... 
} 
0的模型

使用看起来像

@model MyModel 

@Html.Custom().CustomEditorFor(x => x.Id, EditorOptions.Option1, null)