我有一个使用Razor模板用C#MVC编写的项目。在我的一个页面上,我有几个包含数值的输入字段。设置这些输入字段值的Razor代码如下所示:
@Html.Editor(Model.DesignParams[i].ParamId,
new {
htmlAttributes = new
{
@Value = Model.DesignParams[i].DefaultValue,
@class = "form-control text-right",
@type = "text",
id = "_" + Model.DesignParams[i].ParamId,
uomid = Model.DesignParams[i].UOMId,
measureid = Model.DesignParams[i].MeasureId
}
})
上面的代码使用FireFox和Chrome工作正常,并生成一个如下所示的输入字段:
<input type="text" uomid="MBH" name="HeatOfRejection" measureid="HeatLoad"
id="_HeatOfRejection" class="form-control text-right text-box single-line"
value="5000.0">
但是同样的Razor代码,用IE查看的相同@Model值会产生这样的结果:
<input Value="5000" class="form-control text-right text-box single-line"
id="_HeatOfRejection" measureid="HeatLoad" name="HeatOfRejection"
type="text" uomid="MBH" value="" />
正如您所看到的,为IE生成的value=
属性之间存在差异,因为获取我的实际值的value属性以大写&#39; V&#39;开头。并且小写值是一个空字符串。我很难过......
任何人都可以告诉我为什么会发生这种情况以及可能如何处理它?</ p>
这种差异会影响jQuery使用以下命令返回输入值的能力:
var value = $(inputfield).attr("value");
也许.val()
将检索输入字段值,但这需要重写支持此页面和其他的核心jQuery代码,所以我想问一下是否有人可以告诉我为什么这个&#39 ;值=&#39;仅为IE创建,如果有办法克服问题。
更新
将@Value更改为@value(或只是值)会导致Firefox和IE中出现空值属性:
<input type="text" value="" uomid="MBH" name="HeatOfRejection" measureid="HeatLoad"
id="_HeatOfRejection" class="form-control text-right text-box single-line">
答案 0 :(得分:3)
您正在“大写”value
html属性。将此更改为小写...
@Value = Model.DesignParams[i].DefaultValue
如下......
@value = Model.DesignParams[i].DefaultValue
IE浏览器并不是最聪明的网页浏览器,并且Trident(它们正在解析引擎)的方式肯定存在问题,因为这些线程中会看到元素的属性......
https://github.com/highslide-software/highcharts.com/issues/1978
Highcharts adds duplicate xmlns attribute to SVG element in IE
另外,正如其他地方已经提到的那样。 Editor
扩展方法需要什么?使用TextBoxFor
而不是更简单吗?
@Html.TextBoxFor(model => model.DesignParams[i].ParamId
, new
{
@class = "form-control text-right"
, uomid = Model.DesignParams[i].UOMId
, measureid = Model.DesignParams[i].MeasureId
})
答案 1 :(得分:3)
正如StuartLC指出的那样,你正试图让Html.Editor
做一些它没有做过的事情。
将@value
或@Value
密钥传递给htmlAttributes
时会发生什么情况,渲染引擎会生成除之外的名称的属性value
已将其归因于:
<input type="text" name="n" value="something" value="somethingElse" />
或
<input type="text" name="n" value="something" Value="somethingElse" />
在这两种情况下,您都会给浏览器带来一些虚假的东西,因此无法表现出可预测的行为。
如上所述,Html.Editor
具有根据您传递给它的value
参数生成expression
属性的功能。问题是你也正在使用它。 Html.Editor()
的第一个参数需要是一个表达式,指示编辑器应绑定到的模型属性。 (例如字符串值"DesignParams[0].ParamId"
)现在,首选的做法是使用更现代的EditorFor
来获取lambda函数,正如StuartLC在他的文章中所示:
@Html.EditorFor(model => model.DesignParams[i].ParamId, ...)
答案 2 :(得分:2)
您不应该以这种方式使用无效的Html属性。使用Html 5中的data-
属性。
此外,您对@Html.Editor(Model.DesignParams[i].ParamId
的使用(假设ParamId是一个字符串)偏离了帮助程序的目的,即反映具有模型的给定名称的属性,并使用此值属性为value
上的Html input
属性。 (MVC将在根模型上寻找一个属性,无论ParamId的值是多少,这似乎都是FWR无声的失败)
我会事先在Controller中或在Model.DesignParams[i].ParamId = Model.DesignParams[i].DefaultValue
构造函数中对DesignParams
进行默认操作。
@Html.EditorFor(m => m.DesignParams[0].ParamID,
new {
htmlAttributes = new
{
// Don't set value at all here - the value IS m.DesignParams[0].ParamID
@class = "form-control text-right",
@type = "text",
id = "_" + Model.DesignParams[i].ParamId,
data_uomid = Model.DesignParams[i].UOMId,
data_measureid = Model.DesignParams[i].MeasureId
}
请注意,这会将输入名称设为DesignParams[0].ParamID
,如果需要,可以将字段发回。
这里是一些示例代码的Gist
(underscore
will be converted到dash
)
在jQuery中使用data()
来获取这些值:
var value = $(inputfield).data("uomid");
答案 3 :(得分:2)
编辑器使用元数据。那你需要更多关于这个, http://aspadvice.com/blogs/kiran/archive/2009/11/29/Adding-html-attributes-support-for-Templates-2D00-ASP.Net-MVC-2.0-Beta_2D00_1.aspx
但最简单的方法是
@model Namespace.ABCModel
@using (Html.BeginForm("Action", "Controller", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.TextBoxFor(model => model.DesignParams[i].ParamId, new { @class = "form-control text-right", uomid = Model.DesignParams[i].UOMId, measureid = Model.DesignParams[i].MeasureId })
}