html辅助扩展方法上的多个通用参数

时间:2010-04-14 13:30:04

标签: c# asp.net-mvc extension-methods

我要做的是为HtmlHelper创建一个扩展方法,以创建一个特定的输出和相关的细节,如TextBoxFor<>。我想要做的是根据TextBoxFor<>指定模型类中的属性,然后指定相关的控制器操作和其他参数。

到目前为止,该方法的签名如下:

public static MvcHtmlString Create<TModel, TProperty, TController>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, Expression<Action<TController>> action, object htmlAttributes)
        where TController : Controller
        where TModel : class

当我去打电话时会出现问题。在我看来,如果我按照TextBoxFor调用它而不指定Model类型,我可以指定lambda表达式来设置它的属性,但是当我去指定我无法执行的操作时。

但是,当我指定控制器类型Html.Create<HomeController>( ... )时,我无法指定要为其创建控件的模型属性。

我希望能够像

一样调用它
<%= Html.Create<HomeController>(x => x.Title, controller => controller.action, null) %>

过去一天,我一直在这个问题上打了几个小时,有人能指出我正确的方向吗?

修改 感谢您对此的回应。

所以没有指定我认为我可以使用的所有类型

<%= Html.Create(x => x.Title, ((HomeController)controller) => controller.action, null) %>

但仍然需要对动作的引用,而不是实际动作本身

*回到思考:)

编辑#2:

我开始认为尝试使其纯粹强类型有点牵强。与提供的html辅助扩展方法相同的行可能只是将动作名称和控制器名称指定为字符串参数是要走的路?!但当然我想做的事情是可能的吗? 点头

2 个答案:

答案 0 :(得分:1)

我认为你能得到的最接近的是:

<%= Html.Create(x => x.Title, (HomeController c) => c.Index(), null) %>

答案 1 :(得分:0)

无法推断类型参数。你别无选择,只能调用它(假设你的TModel是Book类型,标题是string类型)

<%= Html.Create<Book, string, HomeController>(x=>x.Title, controller=>controller.SomeAction(), null) %>

否则它将无法知道它应该调用哪个控制器。

问候。