これらは私の問題を再現するためのステップです:
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);
}
問題は、ビューモデルの作成のコンストラクタコードですか?htmlは正しいようですが、なぜ残りは何らかの役割を果たすことができますか?クライアントにレンダリングされるものは重要です...