Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 非强类型视图中方法的Html标签/文本框_C#_Asp.net Mvc_Razor - Fatal编程技术网

C# 非强类型视图中方法的Html标签/文本框

C# 非强类型视图中方法的Html标签/文本框,c#,asp.net-mvc,razor,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(

是否可以在强类型视图之外以任何方式使用帮助器方法,如
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模型绑定的所有好处


有人能告诉我怎么做吗。使用当前现有的mvc功能(或B)执行此操作。请给我一些关于替代方法的指导,这些方法仍然具有“For”扩展的所有好处。

否。但是,这并不是您继续使用的最佳方法。视图助手是一个可怕的范例,微软的某些人应该因为引入视图助手而被打耳光。一般来说,对于可能考虑使用视图辅助对象的任何内容,您都希望坚持使用
HtmlHelper
扩展和/或局部视图

在这个场景中,实际上最好使用编辑器模板,这只是一种特殊的局部视图。例如,使用
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
编辑器模板

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


您必须编写自定义html帮助程序,然后
视图帮助程序是一个可怕的范例,Microsoft的某个人应该因为引入
而被打耳光……您应该将您的声明备份到此处。在MVC中,视图应该是无逻辑的。当然,这并不总是可能的,但这就是目标。然后,ASP.NET MVC允许您在视图中创建整个复杂的函数,这与MVC模式完全不同。更糟糕的是,这段代码直到运行时才编译,所以如果出现问题,您在构建时不会失败,在运行时也会失败——永远不会好(这也是通常应该避免使用视图逻辑的另一个原因)。最后,视图很难测试,在某些类中,视图作为一种方法很容易测试。虽然我认为您的观点有点极端,因为我知道视图助手在许多情况下是有益的,但这是正确的答案,因为它比我预期的更好地解决了我的确切问题。我用这个答案重复使用了大量的模板代码,它使我免于复制和粘贴。它也比我提供的示例代码优雅得多。谢谢也许暗示轻微殴打是极端的,但老实说,我想不出一个场景,视图助手会是最好的方式。因为它们本质上是函数,所以作为视图助手可以做的任何事情都可以作为类方法或扩展来完成。由于后者是编译的,易于在项目之间共享,易于测试,而前者缺少所有这些,因此视图助手显然是一个失败者。