複数の再利用可能な要素を使用してビルドしようとしている MVC3 カミソリ プロジェクトがあります。次のような多くのモデルクラスがあります
public class ProductCreateModel
{
[Required]
[Display(Name = "Org")]
[UIHint("MyOrgsDropDown")]
public string orgName { get; set; }
[Required(ErrorMessage = "Select an account")]
[Display(Name = "Account")]
[UIHint("MyAccountsDropDown")]
[AdditionalMetadata("orgFieldId", "orgName")]
[AdditionalMetadata("fieldId", "accountName")]
public string accountName { get; set; }
}
この例では省略している他のフィールドがあります
MyAccountsDropDown.cshtml は次のようになります。
@{
var values = ViewData.ModelMetadata.AdditionalValues;
string orgFieldId = (string)values["orgFieldId"];
string fieldId = (string)values["fieldId"];
}
<script type="text/javascript">
$(document).ready(function () {
$("#@orgFieldId").change(function () {
var idProd = $(this).val();
$.getJSON("/JsonService/GetAccounts", { orgId: idProd },
function (myData) {
var select = $("#@fieldId");
select.empty();
$.each(myData, function (index, itemData) {
select.append($('<option/>', {
value: itemData.Value,
text: itemData.Text
}));
});
});
});
});
</script>
@Html.DropDownList("", new SelectList(Enumerable.Empty<SelectListItem>(), "Value", "Text"), "---Select---", new { id = fieldId })
私のコントローラーメソッドは次のようになります。
[HttpGet]
public ActionResult AddProduct()
{
return PartialView("_AddProduct");
}
[HttpPost]
public ActionResult AddProduct(ProductCreateModel model)
{
if (!ModelState.IsValid)
{
return PartialView("_AddProduct", model);
}
//do some stuff
return PartialView("_AddProduct");
}
したがって、ビューが (jQuery ダイアログ ボックスとして) 開くと、フォームがすべて設定されます。orgName を選択すると、データベースから accountName がプルされます (カスケード)。モデル検証を使用しているため、すべての必須フィールドに入力せずに送信を押すと、検証メッセージが表示されます。また、送信前に入力したフィールドの事前入力値も表示されます。削除されるのは、カスケードされたドロップダウン値です。そのため、選択された orgName は引き続き表示されますが、accountName ドロップダウンは以前に入力された値をデータベースから失います。
送信がクリックされる前に既にプルされた SelectItems を維持するにはどうすればよいですか