非强类型视图中的Html Label / TextboxFor方法

时间:2015-03-18 15:14:59

标签: c# asp.net-mvc razor

是否有可能以任何方式在强类型视图之外使用Html.LabelFor(x=>x.Name)之类的辅助方法?例如,我在App_Code / MyTemplates.cshtml中有一个全局帮助器

@helper BuildInput(MyCustomObject c){

    Html.Label("LabelText","PropertyName")
    Html.Input("PropertyName","value")
}

我希望能够写出这样的代码:

@helper BuildInput(MyCustomObject c){

    Html.LabelFor(c, x=>x.Name)
    Html.TextBoxFor(c, x=>x.Name)
}

所以我可以绑定到任意对象。而不是第一个参数是引用模型的lambda,第一个参数可以是我想要绑定的对象,第二个参数可以是绑定表达式。

这不起作用,因为A)。 LabelFor方法在强类型视图之外不可用,并且B)。 “x”自动指模型。

目前,“For”扩展仅适用于强类型视图,并且只能与模型一起使用。我希望能够在全局帮助器方法中将这些方法与任意对象(而不是模型)一起使用。我仍然想使用这些“For”扩展,这样我就可以获得重构和MVC模型绑定的所有好处。

有人可以告诉我如何A)。使用当前存在的mvc功能或B)执行此操作。给我一些关于替代方法的指导,这些方法仍然具有“For”扩展的所有好处。

1 个答案:

答案 0 :(得分:2)

没有。但是,这不是您继续进行的最佳方式。查看帮助程序是一个可怕的范例,微软的某个人应该被打耳光进行介绍。一般情况下,您希望坚持使用HtmlHelper扩展和/或部分视图来查看使用视图帮助程序的任何内容。

在这种情况下,您实际上最好使用编辑器模板,这只是一种特殊的局部视图。例如,使用Name属性,您可以添加以下部分视图:

<强>视图\共享\ EditorTemplates \ String.cshtml

@Html.Label("")
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue)

然后,在您看来,您需要做的就是:

@Html.EditorFor(m => m.Name)

标签和文本框都将被渲染。按惯例,Name是一个字符串,因此Razor会在String.cshtml中自动查找并使用Views\Shared\EditorTemplates编辑器模板。

您可以使用显示/编辑器模板做更多事情。我有几篇帖子可以给你介绍: