编辑: 在看了我这样做的方式之后,我决定改变我的整个视图模型,所以这个问题不再有效了。我不介意知道我做错了什么,但我真的不需要我的项目答案。
谢谢!
当下拉列表的值发生更改时,我使用Javascript更改文本框的值。发布页面时,Javascript中更改的值始终为零。
Javascript似乎工作正常,但该值不会使其返回服务器。
这是我的观点模型:
...
[Required(ErrorMessage = "\"{0}\" is required")]
[Display(Name = "Mileage Out")]
public decimal MileageOut { get; set; }
[Required(ErrorMessage = "Vehicle is required.")]
public Guid VehicleID { get; set; }
[Display(Name = "Vehicle")]
public List<SelectListItem> Vehicles { get; set; }
....
以下是我的观点:
....
<div class="editor-label">
@Html.LabelFor(model => model.Vehicles, "Vehicle")
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.VehicleID, new SelectList(Model.Vehicles, "Value", "Text"), "Vehicle is required . . .", new {@onchange="GetLastMileage(this.value);"})
@Html.ValidationMessageFor(model => model.Vehicles)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.MileageOut)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.MileageOut, null, "txtMileageOut")
@Html.ValidationMessageFor(model => model.MileageOut)
</div>
...
<script type="text/javascript">
function GetLastMileage(vehicleID) {
switch (String(vehicleID))
{
@{
foreach (KeyValuePair<string, decimal> item in Model.VehiclesLastMileage)
{
@Html.Raw("case '" + item.Key + "': document.getElementById('txtMileageOut').value = '" + ((decimal)item.Value).ToString() + "';break;")
}
}
default: return 0;
}
}
</script>
我发现如果我改变了这个:
@Html.EditorFor(model => model.MileageOut, null, "txtMileageOut")
到此:
@Html.EditorFor(model => model.MileageOut)
日期回到服务器正常,但JavaScript不起作用(文本框上没有id)。显然我使用错误的方法来更改客户端上的值,但我不知道正确的方法。
谢谢!
答案 0 :(得分:2)
更改javascript。
document.getElementById('txtMileageOut').value
到
document.getElementById('MileageOut').value
此外,您应该使用jQuery并将javascript移动到其自己的外部文件。它还会简化JS代码。您可以使用分类作为选择器而不是ID,并在更少的代码中执行更多操作。