use*_*570 7 c# generics asp.net-mvc html-helper
我有以下html帮助方法:
public static MvcHtmlString CustomEditorFor<TModel, TProperty>(this HtmlHelper<TModel> helper,
Expression<Func<TModel, TProperty>> expression,
EditorOptions options,
object htmlAttributes)
{
}
Run Code Online (Sandbox Code Playgroud)
我需要将它移动到以这种方式构造的帮助程序库中:
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 );
}
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何构造我的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)
{
}
}
Run Code Online (Sandbox Code Playgroud)
最终目标是能够以这种方式使用它:@ Html.Custom().CustomEditorFor(model => model.Property)
任何帮助将不胜感激.
你的情况并不遥远,只需将你的更改HelperFactory为 take in TModel,这样你就可以将它绑定到一个泛型HtmlHelper并制作CustomEditorFor泛型,这样它就可以接受任何TPropertyie
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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你需要做的就是更新扩展方法
public static class HtmlHelperExt
{
public static HelperFactory<TModel> Custom<TModel>(this HtmlHelper<TModel> helper)
{
return new HelperFactory<TModel>(helper);
}
}
Run Code Online (Sandbox Code Playgroud)
所以对于像这样的模型
public class MyModel
{
public int Id { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
用法看起来像
@model MyModel
@Html.Custom().CustomEditorFor(x => x.Id, EditorOptions.Option1, null)
Run Code Online (Sandbox Code Playgroud)