我有一个dropdownlist
:
<div class="a">
@Html.DropDownList("StorageId", null, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.StorageId)
</div>
HTML:
<div class="a">
<select class="form-control" id="StorageId" name="StorageId"><option selected="selected" value="1">Brak Brak</option>
<option value="2">First</option>
<option value="23">Second</option>
<option value="24">Third</option>
</select>
<span class="field-validation-valid" data-valmsg-for="StorageId" data-valmsg-replace="true"></span>
</div>
填充代码:
ViewBag.StorageId = new SelectList(unitOfWork.storageRepository.Get(), "Id", "Name", deviceusage.StorageId);
与此Ajax请求一起将所有数据发送到控制器:
$.ajax({
url: "/DeviceUsage/Edit",
type: "POST",
contentType: "application/json; charset=utf-8",
headers: {
'RequestVerificationToken': '@TokenHeaderValue()'
},
data: JSON.stringify({
deviceusage: {
DeviceInstanceId: $('.a').children("#DeviceInstanceId").val(),
UserId: $('.a').children('#UserId').val(),
StorageId: $('.a').children('#storageId').val()
}
}),
error: function (data) {
alert("wystąpił nieokreślony błąd " + data);
},
success: function (data) {
if (data.ok) {
$("#Modal").modal('hide');
window.location = data.newurl;
}
else {
$('.modal-body').html(data);
}
}
})
没关系,我在此下拉列表中选择的内容不会更新。更改第一个选择后,始终将第一个发送给控制器。
@Update:这是我用来处理“ Post”调用的控制器方法:
public ActionResult Edit([Bind(Include="StorageId,UserId,DeviceInstanceId")] DeviceUsage deviceusage)
{
ValidateRequestHeader(Request);
if (deviceusage.UserId == 6 && deviceusage.StorageId == (int)Storage.Biurko)
{
ModelState.AddModelError("", "Zarezerwowane urządzenie nie moze byc przypisane do biurka");
}
if (deviceusage.UserId == 1 && deviceusage.StorageId == (int)Storage.Biurko)
{
ModelState.AddModelError("", "Wolne urządzenie nie może przebywać na jakimś biurku");
}
if ((deviceusage.UserId != 1 & deviceusage.UserId != 6) & deviceusage.StorageId != (int)Storage.Biurko)
{
ModelState.AddModelError("", "Urzązenie przypisane do kogos nie moze przebywac w magazynie");
}
if (ModelState.IsValid)
{
unitOfWork.deviceUsageRepository.Update(deviceusage);
unitOfWork.Save();
return Json(new { ok = true, newurl = Url.Action("Index") });
}
ViewBag.DeviceInstanceId = new SelectList(unitOfWork.deviceInstanceRepository.Get(), "Id", "SerialNo", deviceusage.DeviceInstanceId);
ViewBag.StorageId = new SelectList(unitOfWork.storageRepository.Get(), "Id", "Name", deviceusage.StorageId);
var data = unitOfWork.userRepository.Get()
.Select(s => new
{
Id = s.Id,
Credentials = s.Name + " " + s.Surname
}
);
ViewBag.UserId = new SelectList(data, "Id", "Credentials", deviceusage.UserId);
return PartialView(deviceusage);
}
如您所见,它的返回是PartialView
因为下拉列表位于模式窗口中,该窗口随Ajax
调用返回而更新。
@ Update2
在使用带有以下代码的浏览器控制台进行测试期间:
$('#StorageId').val()
我设法找到了:
第一次发送之前其正确返回的值
如果由于数据错误而重新加载了模态。使用列表更改选择的值不会更改任何内容。与此代码一起返回的值是使用ajax发送的错误。
总是将第一个值提交给控制器的问题背后的原因是因为此属性在下拉列表框中设置为第一个选项selected="selected"
。
您可以像这样通过更改事件回叫来绕过此行为
JQUERY代码:
$('.a select').on('change',function() {
$(this).find('option:selected').attr("selected","selected");
});
在页面正文的$(document).ready( function() { ...... })
或onload
中添加上述事件侦听器。
快乐编码:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句