0

私のレジスターはフォームを返すときに完全に機能しますが、私が作成したレジスターは何も返しません。VisualStudioが提供する登録ページとは異なる方法で何をしているのかわかりません。正しいhttppostメソッドを呼び出しますが、渡される値はnullです。助けてくれてありがとう。そのモデルをコントローラーのアクション結果にポストバックしたいだけです。

コントローラ

[HttpGet]
        public ActionResult Support()
        {
            ViewBag.Message = "Your app description page.";

            return View();
        }
          [AllowAnonymous]
        [HttpPost, ValidateSpamPrevention]
        public ActionResult Support(QuickEmailModel email)
        {
            if (ModelState.IsValid)
            {
                 return View("thankyou", email);
            }
            return View(email);

        }

モデル

public class QuickEmailModel
{
    [DataType(DataType.EmailAddress)]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    public string Subject { get; set; }

    [Required]
    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    [Display(Name = "Company (Optional):")]
    public string Company { get; set; }
}

}

ビューのトップ

@using PoliteCaptcha
@model Models.QuickEmailModel
@{
    ViewBag.Title = "Support";
}

フォームがある下部

 @using (Html.BeginForm())
                {
                    @Html.ValidationSummary()
                    <div class="control-group">
                        <label class="control-label">
                            @Html.LabelFor(x => x.Company, "Company (Optional):", new { @class = "control-label" })</label>
                        <div class="controls">
                            @Html.TextBoxFor(x => x.Company, new { @class = "span4" })
                        </div>
                    </div>
                    <div class="control-group">
                        @Html.LabelFor(x => x.Email, "Email:", new { @class = "control-label" })
                        <div class="controls">
                            @Html.TextBoxFor(x => x.Email, new { @Class = "span4" })
                        </div>
                    </div>
                    <div class="control-group">
                        <label class="control-label">
                            @Html.LabelFor(x => x.Subject, "Subject:", new { @class = "control-label" })</label>
                        <div class="controls">
                            @Html.TextBoxFor(x => x.Subject, new { @class = "span4" })
                        </div>
                    </div>
                    <div class="control-group">
                        <label class="control-label">
                            @Html.LabelFor(x => x.Subject, "Description:", new { @class = "control-label" })</label>
                        <div class="controls">
                            @Html.TextAreaFor(x => x.Description, new { @class = "span4", @rows = "6", id = "txtDescription" })
                        </div>
                    </div>
                    @Html.SpamPreventionFields()
                    <input type="submit" class="btn btn-success" id="btnSubmit" value="Submit" style="margin-right: 15em;
                        float: right;" />
                }
4

2 に答える 2

3

問題は、パラメータ名がフィールド名(電子メール)の1つと同じであるということだと思います。メソッドパラメータ名をモデル(または電子メール以外の名前)に変更します。

私が起こっていると思うのは、MVCモデルバインダーが「email」という名前の投稿された値を見て、それを同じ名前のパラメーターに割り当てようとしていることですが、文字列ではないため、それを行うことはできません。したがって、nullを割り当てます。

また、モデルバインディングでは大文字と小文字が区別されないため、EメールとEメールは同じです。

于 2012-09-27T22:01:33.470 に答える
0

問題は、モデルマッパーがフォームの名前と値のペアをPOSTリクエストからQuickEmailModelオブジェクトのインスタンスにマップできず、単にそれらを無視することです。Firebugまたは他のツールで送信されているPOSTリクエストを調べます。名前と値のペアの名前は何ですか?

あなたはおそらく次のようにあなたの見方を変えるべきです:

@{ var email = ....; }

<label class="control-label">
    @Html.LabelFor(x => email.Company, "Company (Optional):", new { @class = "control-label" })
</label>
<div class="controls">
    @Html.TextBoxFor(x => email.Company, new { @class = "span4" })
</div>

POSTアクションパラメータの名前が「email」であるためです。これにより、フォームパラメータ名を「email.Company」などに強制する必要があると思います。そうでない場合は、他のバリアントを試してください。

@Html.TextBox("email.Company", model.Company)
于 2012-09-27T21:46:01.680 に答える