JQuery无法设置html输入控件的值

时间:2014-02-26 23:58:19

标签: javascript jquery html asp.net-mvc-4 twitter-bootstrap-3

我有一个使用Twitter API的MVC4应用程序,我必须在自动完成(KendoUI)返回值后在Javascript函数中设置某些值。查找工作正常,我可以设置两个值之一但javascript方法不能设置第二个值,它被忽略。我尝试过很多东西,例如将readonly属性设置为false,设置值,然后将readonly设置为true。我也尝试完全从html标记中删除readonly属性。它仍然无视这一变化。唯一的区别在于如何在html中声明字段。

正在成功设置的字段是EntityID,正在忽略EntityName。

这是字段的标记,后跟javascript方法:

<div class="row">
    <!-- EntityID -->
    <span class="col-sm-2">
        <label>Entity ID:</label>
    </span>
    <span class="col-sm-3">
        @Html.TextBoxFor(model => model.EntityID, new { @class = "form-control" })
    </span>
    <span class="col-sm-7"></span>
</div>

<div class="row">
    <!-- EntityName -->
    <span class="col-sm-2">
        <label>Entity Name:</label>
    </span>
    <span class="col-sm-8">
        <input type="text" class="form-control" id="EntityName" 
            style="background-color:lightcyan;"                                  
            value="@Model.EntityName" />
    </span>
    <span class="col-sm-2"></span>
</div>

以下是javascript方法:

function onWOChange(e) {
    // this event will fire more than once, first on selection of a value from the AutoComplete list
    // then when the AutoComplete control loses focus.  The second time around, the task variable
    // will be null as it was parsed from the AutoComplete select list (a necessary hack) in the 
    // first iteration.  Do not set the WorkTaskNumber field or perform the AJAX lookup on the
    // second iteration.

    //alert('onChange event for workorderid autocomplete has fired');

    var workOrderTask = $("#WorkOrderID").val();
    var parms = workOrderTask.split('-');
    var task = parms.length == 1 ? null : parms[1];

    // parse the task from the workorder id and populate the workorder/task fields
    $('#WorkOrderID').val(parms[0]);
    if (task != null) {
        $('#WorkTaskNumber').val(task);
    }

    // don't try the AJAX lookup if task variable is null
    if (task != null) {
        // look up the entity for the selected work order and populate the entity id/name fields
        $.post('@Url.Action("LookupEntityByWorkOrderTask", "Home")', {
            workOrderID: parms[0],
            taskID: task
        }, function (data) {
            if (data.error) {
                // process error
                alert('Entity lookup error ' + data.val);
            } else {
                // update entity values
                $("#EntityID").val(data.EntityID);

                //$("#EntityName").attr('readonly', false);

                try {
                    $("#EntityName").val(data.EntityName);
                } catch (e) {
                    alert('error' + e);
                }
                //$("#EntityName").attr('readonly', true);

            }
        });
    }

1 个答案:

答案 0 :(得分:0)

好的,我想出来了。这是使用Html助手的缺点。事实证明,我无意中在表单上有两个名称相同的控件。发生这种情况是因为用户不会修改EntityName。 POST中需要数据,并且还需要向用户显示数据。如果用户更改表单上的其他值,则实体可以更改,因此必须更新实体编号和名称。

我有一个Html.HiddenFor控件,其中帮助器(EntityName)为我设置了ID。对于显示控件,我不得不转到原始html标记,因为Twitter Bootstrap上下文中的Html.TextboxFor会截断显示值(不知道为什么,但它必须是CSS中的东西,如果我找到它我不想要无论如何改变)。我手动设置该字段的ID。实际上,如果我使用TextboxFor并且更难找到,也会发生这种重复。

由于显示控件是只读的,我仍然必须有重复的隐藏字段,否则数据不会返回到POST中的服务器。如果有人知道一个光滑的方式,我很想听听它。

感谢那些提出建议的人!