2015-06-03 105 views
3

目前我正在学习ASP.NET MVC和我看到下面的代码片段:ASP.NET MVC的HtmlHelper剃刀语法

@Html.TextBoxFor(m => m.FirstName, new { @placeholder = "First name"}) 

据我所知,lambda表达式是指模型,但第二个参数是什么?它似乎是一个匿名类型,但我的主要问题是为什么在占位符前面会出现一个字符@

+0

第二个参数是传递其他HTML属性的对象。在这种情况下,您希望将'placeholder' HTML属性添加到输入中。如果您使用保留字(关键字),则需要@符号。否则,你会得到一个编译错误。虽然“占位符”不是关键字,但在这种情况下不需要。 – Styxxy

回答

1

@placeholder语法告诉剃须刀引擎,您要为要由助手呈现的元素的html属性赋值。因此,如果你需要设置一个类的文本框为好,你的匿名类型将改变为:

new { @placeholder = "First name", @class = "BoldText" } 

至于为什么你用@,将@允许您使用保留的关键字作为变量名。如果你试图用

class = "BoldText" 

您会收到运行时错误在你看来,因为class是C#中的保留关键字。预备版@确保不会发生这种情况,并被视为“最佳做法”。 @只会在class之前,而不是placeholder

+0

是的,但为什么@? –

+0

@Nicolas:如果您使用保留字(关键字),则需要@符号。否则,你会得到一个编译错误。虽然“占位符”不是关键字,但在这种情况下不需要。 – Styxxy

+0

@Styxxy在这种情况下,你会收到一个运行时异常,而不是编译错误,因为这是一个剃须刀视图。 –

5

第二个参数是htmlAttributes,您可以使用它将附加属性添加到由助手生成的HTML中(@ Html.TextBoxFor是一个HTML助手)。

为您的示例生成的代码将是沿着线:

@Html.TextBoxFor(m => m.FirstName, new { @placeholder = "First name"}) 
<input type="text" name="FirstName" placeholder="First name" /> 

如果你愿意,你可以添加更多的属性,而且它们也将被添加到生成的标签:

​​

它也可以覆盖使用Value文本框的值(上下的V!):

@Html.TextBoxFor(m => m.FirstName, new { placeholder = "First name", Value="John Johnson"}) 
<input type="text" name="FirstName" placeholder="First name" value="John Johnson" /> 

@符号的原因适用于您想要一个完全按照C#reserved word命名的属性。类,私有,命名空间等。这是一种使C#编译器停止解释它的方式,因为它是C#的意思。 @符号仅用于这些保留字。

1

第二个参数需要您希望在输入中指定的htmlAttributes的匿名对象。

您使用@符号告诉剃须刀引擎您指定的是htmlAttribute而不是保留关键字。