Html Label/TextboxFor 非强类型视图中的方法
Html Label/TextboxFor methods in non-strongly typed view
是否可以在强类型视图之外以任何方式使用 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" 扩展的所有优点。
没有。但是,无论如何,这不是您继续进行的最佳方式。 View helpers 是一个可怕的范例,Microsoft 的某个人应该因为引入而受到抨击。一般来说,对于您可能考虑使用视图助手的任何内容,您都希望坚持 HtmlHelper
扩展 and/or 局部视图。
在这种情况下,实际上最好使用编辑器模板,它只是一种特殊的局部视图。例如,对于 Name
属性,您可以添加以下部分视图:
Views\Shared\EditorTemplates\String.cshtml
@Html.Label("")
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue)
那么,在你看来,你需要做的就是:
@Html.EditorFor(m => m.Name)
标签和文本框都会被渲染。按照惯例,Name
是一个字符串,因此 Razor 会自动在 Views\Shared\EditorTemplates
中查找并使用 String.cshtml
编辑器模板(如果找到的话)。
您可以使用 display/editor 模板做更多的事情。我有几个帖子可以给你一个介绍:
是否可以在强类型视图之外以任何方式使用 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" 扩展的所有优点。
没有。但是,无论如何,这不是您继续进行的最佳方式。 View helpers 是一个可怕的范例,Microsoft 的某个人应该因为引入而受到抨击。一般来说,对于您可能考虑使用视图助手的任何内容,您都希望坚持 HtmlHelper
扩展 and/or 局部视图。
在这种情况下,实际上最好使用编辑器模板,它只是一种特殊的局部视图。例如,对于 Name
属性,您可以添加以下部分视图:
Views\Shared\EditorTemplates\String.cshtml
@Html.Label("")
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue)
那么,在你看来,你需要做的就是:
@Html.EditorFor(m => m.Name)
标签和文本框都会被渲染。按照惯例,Name
是一个字符串,因此 Razor 会自动在 Views\Shared\EditorTemplates
中查找并使用 String.cshtml
编辑器模板(如果找到的话)。
您可以使用 display/editor 模板做更多的事情。我有几个帖子可以给你一个介绍: