我有一个使用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);
}
});
}
答案 0 :(得分:0)
好的,我想出来了。这是使用Html助手的缺点。事实证明,我无意中在表单上有两个名称相同的控件。发生这种情况是因为用户不会修改EntityName。 POST中需要数据,并且还需要向用户显示数据。如果用户更改表单上的其他值,则实体可以更改,因此必须更新实体编号和名称。
我有一个Html.HiddenFor控件,其中帮助器(EntityName)为我设置了ID。对于显示控件,我不得不转到原始html标记,因为Twitter Bootstrap上下文中的Html.TextboxFor会截断显示值(不知道为什么,但它必须是CSS中的东西,如果我找到它我不想要无论如何改变)。我手动设置该字段的ID。实际上,如果我使用TextboxFor并且更难找到,也会发生这种重复。
由于显示控件是只读的,我仍然必须有重复的隐藏字段,否则数据不会返回到POST中的服务器。如果有人知道一个光滑的方式,我很想听听它。
感谢那些提出建议的人!