データを非同期的にコントローラーに投稿するフォームを含む PartialView があります。コントローラーは、有効な場合はユーザーを追加しModelState
、そうでない場合は、無効なモデルを含む PartialView を返します。私が直面している問題は、ModelState
何があっても常に有効であることです。フォームが適切にシリアル化され、すべてのプロパティが入力されていることがわかりますDynamicActionUserModel.RegisterModel
。
なぜそうなるのかわかりませんが、モデル内にモデルがあるためにモデル バインディングが機能しない可能性はありますか?
これが私のコードです...
意見
@model IEnumerable<RobotDog.Models.UserModel>
<!-- other stuff -->
<div class="createUser">
@Html.Partial("_UserPartial", new DynamicActionUserModel { Action = "CreateUser", RegisterModel = new RegisterModel() })
</div>
<script type="text/javascript">
$(function () {
$('form.ajax').submit(function () {
if ($(this).valid()) {
$.ajax({
url: this.action,
type: this.method,
data: $(this).serialize(),
success: function (result) {
if (result.success) {
location.reload(true);
} else {
$('.createUser').html(result);
}
}
});
}
return false;
});
});
</script>
_User部分ビュー
@model RobotDog.Models.DynamicActionUserModel
@using(Html.BeginForm(Model.Action,"Admin", FormMethod.Post, new { @class = "ajax" })) {
@Html.ValidationSummary(true, "Registration unsuccessful. Please correct errors and try again.")
@Html.TextBoxFor(x => x.RegisterModel.Email, new { @class = "input-xlarge", @placeholder = "Email"})
@Html.TextBoxFor(x => x.RegisterModel.UserName, new { @class = "input-xlarge", @placeholder = "User Name"})
@Html.PasswordFor(x => x.RegisterModel.Password, new { @class = "input-xlarge", @placeholder = "Password"})
@Html.ListBoxFor(x => x.RegisterModel.SelectedRoles, Model.RegisterModel.Roles)
<input type="submit" value="Submit" class="btn"/>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
DynamicActionUserModel
public class DynamicActionUserModel {
public string Action { get; set; }
public RegisterModel RegisterModel { get; set; }
}
public class RegisterModel {
[Required(AllowEmptyStrings = false)]
[Display(Name = "User name")]
public string UserName { get; set; }
[Required]
[DataType(DataType.EmailAddress)]
[Display(Name = "Email address")]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
public string[] SelectedRoles { get; set; }
public MultiSelectList Roles {
get { return new MultiSelectList(System.Web.Security.Roles.GetAllRoles()); }
}
}
コントローラ
[HttpPost]
public ActionResult CreateUser(DynamicActionUserModel model) {
if (!ModelState.IsValid) {
foreach(var value in ModelState.Values) {
foreach (var error in value.Errors) {
ModelState.AddModelError(string.Empty, error.ErrorMessage);
}
}
return PartialView("_UserPartial", model);
}
try {
...
return Json(new { success = true });
}
catch(Exception e) { ... }
return PartialView("_UserPartial", model);
}