web-dev-qa-db-ja.com

ASP.NET MVC 5フォーム検証

ASP.NET MVCを初めて使用し、バージョン5を使用しています。レイアウト内にあるフォームを作成しましたが、ビューに検証エラーを表示できません。アクションに正しくポストされ、モデルが有効な場合は実行されます。モデルが無効な場合、次のエラーが発生します。

誰かが私を正しい方向に向けてくれることを願っています。前もって感謝します!

Server Error in '/' Application.

The view 'ContactSubmit' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Home/ContactSubmit.aspx
~/Views/Home/ContactSubmit.ascx
~/Views/Shared/ContactSubmit.aspx
~/Views/Shared/ContactSubmit.ascx
~/Views/Home/ContactSubmit.cshtml
~/Views/Home/ContactSubmit.vbhtml
~/Views/Shared/ContactSubmit.cshtml
~/Views/Shared/ContactSubmit.vbhtml

これは私が使用している私のモデルです:

public partial class Lead
{
    [Key]
    public int LeadId { get; set; }

    [Required]
    [StringLength(50, MinimumLength=2, ErrorMessage="* A valid first name is required.")]
    [Display(Name="First Name")]
    public string FirstName { get; set; }

    [Required]
    [StringLength(50, MinimumLength=2, ErrorMessage="* A valid last name is required.")]
    [Display(Name="Last Name")]
    public string LastName { get; set; }

    [Required]
    [StringLength(50, MinimumLength=2, ErrorMessage="* A valid company is required.")]
    public string Company { get; set; }

    [Required]
    [StringLength(50)]
    [EmailAddress(ErrorMessage="* A valid email address is required.")]
    public string Email { get; set; }

    [Required]
    [StringLength(15, MinimumLength=9, ErrorMessage="* A valid phone nunber is required.")]
    [Phone(ErrorMessage="Please enter a valid phone number.")]
    public string Phone { get; set; }
}

これは私のホームコントローラーにあるコードです:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ContactSubmit(
    [Bind(Include = "FirstName, LastName, Company, Email, Phone")]
    Lead lead)
{
    try
    {
        if (ModelState.IsValid)
        {
            lead.Tenant = SessionManager.Get<Tenant>(Constants.SessionTenant);
            lead.Refferer = SessionManager.Get<string>(Constants.SessionRefferal);
            DataStoreManager.AddLead(lead);
            return RedirectToAction("SubmissionConfirmed", lead);
        }
    }
    catch (DataException /* dex */)
    {
        ModelState.AddModelError("", "Unable to perform action. Please contact us.");
        return RedirectToAction("SubmissionFailed", lead);
    }

    return View(lead);
}

[HttpGet]
public ActionResult ContactSubmit()
{
    return View();
}

これは私のレイアウトにあるフォームです:

               @using (Html.BeginForm("ContactSubmit", "Home", FormMethod.Post))
                    {
                        @Html.AntiForgeryToken()
                        <fieldset>
                            <div class="editor-label">
                                @Html.LabelFor(m => m.FirstName)
                            </div>
                            <div class="editor-field">
                                @Html.EditorFor(m => m.FirstName)
                                @Html.ValidationMessageFor(m => m.FirstName)
                            </div>

                            <div class="editor-label">
                                @Html.LabelFor(m => m.LastName)
                            </div>
                            <div class="editor-field">
                                @Html.EditorFor(m => m.LastName)
                                @Html.ValidationMessageFor(m => m.LastName)
                            </div>

                            <div class="editor-label">
                                @Html.LabelFor(m => m.Company)
                            </div>
                            <div class="editor-field">
                                @Html.EditorFor(m => m.Company)
                                @Html.ValidationMessageFor(m => m.Company)
                            </div>

                            <div class="editor-label">
                                @Html.LabelFor(m => m.Email)
                            </div>
                            <div class="editor-field">
                                @Html.EditorFor(m => m.Email)
                                @Html.ValidationMessageFor(m => m.Email)
                            </div>

                            <div class="editor-label">
                                @Html.LabelFor(m => m.Phone)
                            </div>
                            <div class="editor-field">
                                @Html.EditorFor(m => m.Phone)
                                @Html.ValidationMessageFor(m => m.Phone)
                            </div>
                            <div class="masthead-button-wrapper">
                                <input class="btn btn-warning" type="submit" value="Submit" />
                            </div>
                        </fieldset>
                    }
8
BoredOfBinary

コードにエラーが1つあります。最初に気づきませんでした。使用しているgetメソッドで-

return View();

つまり、あなたのビューはパラメータを許可していませんが、エラーが発生したときに使用しています-

return View(lead);

この場合、MVCは同じ名前のビューを探していますが、Leadタイプのパラメーターも受け入れますが、そのオプションを持つビューがなく、見つかった唯一のパラメーターがパラメーターとして受け入れないため、失敗します。 Getメソッドから見た。エラーがない場合、リダイレクトしています-

return RedirectToAction("SubmissionConfirmed", lead);

パラメータ付きのビューを検索する必要はなく、エラーも発生しません。

したがって、Leadのパラメーターを受け入れるようにビューを変更し、それに応じてgetメソッドを変更します。

これが役立つかもしれません。 -

[HttpGet]
public ActionResult ContactSubmit()
{
    var lead = new Lead();
    return View(lead);
}

そしてビューに追加

@model Lead

頂点で

[〜#〜] edit [〜#〜]:リダイレクトする場合、リクエストごとにModelStateが初期化されることを知っておく必要があるため、リダイレクトすると自動的にクリアされます。クライアント側の検証を使用する場合は、modelstate以上を渡すために他の手段を使用する必要があります。

3
brainless coder