2014-01-24 6 views
7

Ich habe folgende HTML-Helfer-Methode:konvertieren statische Methode mit generischen paramerter auf eine generische Klasse

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

ich ein Bedürfnis haben, in eine Helfer-Bibliothek bewegen sie zu setzen, die auf diese Weise strukturiert ist:

Ich kann nicht herausfinden, wie ich meine HelperFactory-Klasse und den EditorBuilder-Klassenkonstruktor strukturiere, um die Generics richtig zu behandeln.

Das ist, was ich versucht und es hat nicht funktioniert:

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) 
    { 

    } 

} 

Das Endziel es zu sein der Lage ist, auf diese Weise zu verwenden. @ Html.Custom() CustomEditorFor (Modell => Modell.Property)

Jede Hilfe würde sehr geschätzt werden.

Antwort

1

Ihr nicht weit weg, nur Ihre HelperFactory in TModel nehmen ändern, so können Sie es zu einem allgemeinen HtmlHelper binden und CustomEditorFor generic machen, so dass es jeder TProperty dh

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); 
    } 
} 

Dann akzeptieren kann alles, was Sie tun müssen, die Erweiterungsmethode wird aktualisiert

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

Also für ein Modell wie

public class MyModel 
{ 
    public int Id { get; set; } 
    ... 
} 

Die Verwendung wie

@model MyModel 

@Html.Custom().CustomEditorFor(x => x.Id, EditorOptions.Option1, null) 
aussehen würde