为什么Razor会添加其他值属性以及如何删除它?

时间:2013-03-20 13:17:11

标签: asp.net-mvc razor asp.net-mvc-4

当我在剃刀视图页面中键入以下内容时:

 @Html.TextBoxFor(m => m.Name, new {@Value="Default Value", @Class = "CSSRadwan" })

它翻译成以下内容:

 <input Class="CSSRadwan" Value="Default Value" id="Name" name="Name" type="text" value="" />

如果我用@value(小“v”)改变@Value,它根本就不会翻译。

我的问题是:

为什么还有另一个名为“value”的属性,它是空的?如何删除它?

为什么“Value”属性中的字符“V”是大写,而另一个很小,如果我想让第一个像普通属性一样小,怎么做呢?

我使用的是MVC4.0和Visual Studio 2012 Update 1.

2 个答案:

答案 0 :(得分:1)

  

为什么还有另一个名为“value”的属性......

如果你看一下MVC的源代码,你会发现在System.Web.Mvc.Html.InputExtensions.cs中,value属性将总是由框架设置,因为方法InputHelper中的以下行:

tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue);

使用TextBoxFor时,isExplicitValuetruevalue属性将覆盖任何名为value的现有html属性。这解释了为什么您无法在new { @value="My value" }中使用TextBoxFor

  

......它是空的?

因为m.Name最初没有值。

  

如何删除它?

如上所示,您无法移除value

  

为什么“Value”属性中的字符“V”是大写,而另一个很小,如果我想让第一个像普通属性一样小,怎么做呢?

必须是Value中的大写V才能将其与小写value区分开来,因此不会被框架覆盖,如上所述。实际上,您将获得如下输出:

<input Value="Default Value" value="" id="Name" name="Name" type="text" />

由于Value出现在html中的value之前,“默认值”将被渲染并显示在浏览器的文本框中。

答案 1 :(得分:0)

HTML input元素的“value”属性表示要发布的值,如果显式设置,则表示默认值。 TextBoxFor帮助器设计用于显示模型中的值,如gustavodidomenico指出的那样,这就是呈现属性的原因。如果您不想呈现value属性,请改用TextBox助手。这是满足您要求的正确工具。

您的value属性具有大写“V”的原因是您在匿名对象的属性名称上指定了一个。 “Class”也是如此。将属性名称更改为以小写字母开头:

new { @class = "CSSRadwan", @value = "Default Value" }