是否有可能以任何方式在强类型视图之外使用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”扩展的所有好处。
答案 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
编辑器模板。
您可以使用显示/编辑器模板做更多事情。我有几篇帖子可以给你介绍: