2

データを非同期的にコントローラーに投稿するフォームを含む 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);
}
4

0 に答える 0