9

私は次のモデルを持っています:

public class RegisterUseraccount
{
    [Required]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "E-Mail-Adresse")]
    public string Email { get; set; }

    [Required]
    [Display(Name = "Vorname")]
    public string FirstName { get; set; }

    [Required]
    [Display(Name = "Nachname")]
    public string LastName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [MinLength(5)]
    [Display(Name = "Passwort")]
    public string Password { get; set; }

    ...
}

そして、次のビュー:

@using (Html.BeginForm("Register", "Useraccount", FormMethod.Post, new { id = "registerUseraccountForm", @class = "ym-form" }))
{
    @Html.ValidationSummary(true)        

    <div class="ym-grid">
        <div class="ym-g50 ym-gl">
            <div class="ym-fbox-text">
                @Html.LabelForRequired(model => model.RegisterUseraccount.FirstName, null)               
                @Html.EditorFor(model => model.RegisterUseraccount.FirstName, new { required = "required", name = "firstName" })
                @Html.ValidationMessageFor(model => model.RegisterUseraccount.FirstName)                  
            </div>
        </div>
    ...

そして私のJavaScript

function sendForm(target) {
    alert(data);
    $.ajax({
        url: target,
        type: "POST",
        contentType: 'application/json',
        data: $("#registerUseraccountForm").serialize(),
        success: ajaxOnSuccess,
        error: function (jqXHR, exception) {
            alert('Error message.');
        }
    });

シリアル化の結果は次のとおりです。

RegisterUseraccount.FirstName=Peter&RegisterUseraccount.LastName=Miller&RegisterUseraccount.Email=miller%40gmail.com&RegisterUseraccount.Password=admin

これは、私が POST しようとしている私のコントローラーメソッドです:

[HttpPost]
public ActionResult Register(RegisterUseraccount registerUseraccount)
{
    ...
}

...しかし、メソッドにデータが届かず、エラー404が発生します。モデルバインダーが機能しないと思います。

機能するのは、firstName=Peter という名前で送信されるデータですが、実際に送信されるのは RegisterUseraccount.FirstName=Peter です。

どうすればこの問題を処理できますか?

4

3 に答える 3

21

削除contentType: 'application/json',してより良いものに変更します(私の観点から)

$('#registerUseraccountForm').submit(function () {
    if ($(this).valid()) {
        $.ajax({
            url: this.action,
            type: this.method,
            data: $(this).serialize(),
            beforeSend: function () {

            },
            complete: function () {

            },
            ...
于 2013-05-23T15:27:34.207 に答える
2

もしかしたら、このモデルを持っているかもしれません

public class YourModel
{
    public RegisterUseraccount RegisterUseraccount { get; set; }
}

この場合、アクションに対応するモデルを配置する必要があります。

[HttpPost]
public ActionResult Register(YourModel model)
{
    var registerUseraccount = model.RegisterUseraccount;
    ...
}

または:

@using (Html.BeginForm("Register", "Useraccount", FormMethod.Post, new { id = "registerUseraccountForm", @class = "ym-form" }))
{
   @{ Html.RenderPartial("RegisterUseraccount"); }
}

RegisterUseraccount.cshtml

@model YourNamespace.RegisterUseraccount

@Html.ValidationSummary(true)        

<div class="ym-grid">
    <div class="ym-g50 ym-gl">
        <div class="ym-fbox-text">
            @Html.LabelForRequired(model => model.FirstName, null)               
            @Html.EditorFor(model => model.FirstName, new { required = "required", name = "firstName" })
            @Html.ValidationMessageFor(model => model.FirstName)                  
        </div>
    </div>

のようなものを変更する必要があります@Html.ValidationSummary (true)

編集

または最も単純な:

data: $("#registerUseraccountForm").serialize().replace("RegisterUseraccount.",""),

編集Ⅱ

data: $("#registerUseraccountForm").serialize().replace(/RegisterUseraccount./g,""),
于 2013-05-23T16:42:37.110 に答える