这些是重现我的问题的步骤:
The user opens a partial view.
The user does not select the correct item in the DropDownList.
The user sends the form to the server.
The form is shown with the validation error.
到目前为止还不错。
困扰我的是用户先前选择的项目被重置。这意味着 DropDownList 中的第一项再次是预选/默认值。
我该如何改变呢?
更新
当 Web 服务器向客户端返回响应时:
$.ajax({
url: $(form).attr('action'),
type: 'POST',
data: form.serialize(),
success: function (response) {
debugger;
if (response.success) {
dlg.dialog("close");
}
else { dlg.html(response); } // In this response the selected item has the correct selected=selected attribute
}
});
该对话框通过 dlg.html(response) 显示响应 html
我发现返回的 html 中的选定项是正确的:
<script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
$('#selectUnitType').ddslick({
showSelectedHTML: false,
onSelected: function (data) {
}
});
var node = $('#TreeDiv').dynatree("getActiveNode");
var selectedParentUnitId = node.data.key;
var templateId = $('input[name=TemplateId]').val();
$('form input[name=IsParentFolder]').val(node.data.isFolder);
$('form input[name=TemplateId]').val(templateId);
$('form input[name=ParentId]').val(selectedParentUnitId);
});
</script>
<form action="/Unit/CreateChildren?_=1358449701481" method="post">
<select
class="input-validation-error"
data-val="true"
data-val-number="The field Selected unit type must be a number."
data-val-required="'Selected Folder Type Id' darf keinen Null-Wert aufweisen."
id="selectUnitType"
name="SelectedFolderTypeId">
<option data-description="Contains other folders" data-imagesrc="../Content/Images/de.png" value="0">Folder</option>
<option data-description="Contains teststeps" data-imagesrc="../Content/Images/gb.png" selected="selected" value="1">Teststep</option>
</select>
</form>
[FluentValidation.Attributes.Validator(typeof(CreateUnitViewModelValidator))]
public class CreateUnitViewModel
{
public CreateUnitViewModel()
{
List<ImageSelectListItem> items = new List<ImageSelectListItem>();
items.Add(new ImageSelectListItem { Description = "Contains other folders", Value = ((int)UnitType.Folder).ToString() , Text = "Folder", ImageFileName = "de.png", Selected = false });
items.Add(new ImageSelectListItem { Description = "Contains teststeps", Value = ((int)UnitType.Teststeps).ToString() , Text = "Teststep", ImageFileName = "gb.png", Selected = false });
DisplayList = items;
}
[Remote("UnitExists", "Unit", ErrorMessage = "This name already exists.", AdditionalFields = "TemplateId")]
public string Name { get; set; }
public Nullable<int> ParentId { get; set; }
public int TemplateId { get; set; }
[DisplayName("Selected unit type")]
public int SelectedFolderTypeId { get; set; }
public int UnitId { get; set; }
public bool IsParentFolder { get; set; }
public IEnumerable<ImageSelectListItem> DisplayList { get; set; }
}
[HttpGet]
public ActionResult CreateChildren()
{
return PartialView(new CreateUnitViewModel());
}
[HttpPost]
public ActionResult CreateChildren(CreateUnitViewModel unitViewModel)
{
if (ModelState.IsValid && !_unitService.UnitExists(unitViewModel.Name, unitViewModel.TemplateId))
{
Unit unit = Mapper.Map<CreateUnitViewModel, Unit>(unitViewModel);
_unitService.CreateChild(unit);
UnitTreeViewModel unitTreeViewModel = Mapper.Map<Unit, UnitTreeViewModel>(unit);
return new JsonNetResult(new { success = true, unit = unitTreeViewModel });
}
ModelState.AddModelError("Name", "This name already exists.");
return PartialView(unitViewModel);
}
问题是 Create viewmodel 的构造函数代码吗?html 似乎是正确的,为什么其余的可以发挥任何作用?呈现给客户的内容很重要...