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 模板做更多的事情。我有几个帖子可以给你一个介绍: