输入字段设置为'Value ='而不是'value ='

时间:2014-12-19 04:08:32

标签: html asp.net-mvc-4 internet-explorer razor input-field

我有一个使用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">

4 个答案:

答案 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 converteddash) 在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 })
}