2

私は、webforms の背景から asp.net MVC を学ぼうとしてきましたが、アクション、コントローラー、およびパーシャルとの関係についてよく理解していなかったと思います...

_LoginPartial.cshtml (Visual Studio のデフォルト コードではなく、同じ名前)を含む_Layout.cshtmlファイルと、同じ部分 (_LoginPartial) も含む Home/Index.cshtml ファイルがあります。コードは次のとおりです。パーシャルの場合:

@model LoginModel
@if (Request.IsAuthenticated) {
    @*<welcome text here>*@
} else {
    if ( Model.Layout == LoginLayout.Compact ) {
        @*<simple layout here>*@
    } else {
        <form method="post" action="~/Profile/Login">
            @Html.AntiForgeryToken()

            @Html.LabelFor(m => m.Email, "Email Field")
            @Html.TextBoxFor(m => m.Email)
            @Html.ValidationMessageFor(m => m.Email)

            @Html.LabelFor(m => m.Password, "Password Field")
            @Html.PasswordFor(m => m.Password)
            @Html.ValidationMessageFor(m => m.Password)

            @Html.ValidationSummary()
        </form>
    }
}

そのため、_Layout.cshtmlファイルには、次のコードを含む_LoginPartial.cshtmlが含まれています (_Layout.cshtml 内にフォーム タグはありません)。

@Html.Partial("_LoginPartial", new LoginModel())

Home/Index.cshtmlには、次のコードを含む同じパーシャルが含まれています (_LoginPartial 内のもの以外にフォーム タグはありません)。

@Html.Partial("_LoginPartial", new LoginModel() {
    Layout = LoginLayout.Full
})

したがって、デフォルトの「AccountController」を使用する代わりに、新しいもの(PostController)を作成して試してみることにしました。上記の部分は、そのデータをProfileControllerに正常に投稿しますが、データが正しくない場合、ValidationMessage は常に空です。コントローラーへのコードは次のとおりです:

public class ProfileController : BaseController
{
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginModel form)
    {
        if (ModelState.IsValid)
        {
            //code to validate the user here
            if (userIsValid)
            {
                FormsAuthentication.SetAuthCookie(form.Email, false);
                return RedirectToAction("Index");
            }
        }

        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return RedirectToAction("Index", "Home");
    }
} 

ご覧のとおり、パーシャルは Home/Index.cshtml を介してアクセスされますが、そのコントローラーは Profile/Login にあるため、Home/Index ページにリダイレクトしても検証メッセージは表示されません...

私の質問は次のとおりです。私は正しいことをしていますか? モデルから ValidationMessage を表示するにはどうすればよいですか? 私が正しいことをしていない場合、これらのアクションとコントローラーは、MVC モデルに忠実になるようにどのように構造化されるべきですか?

完全を期すために、ここに私の LoginModel クラスを示します。

public enum LoginLayout {
    Compact,
    Full
}
public class LoginModel
{
    public LoginLayout Layout { get; set; }

    [Required(ErrorMessage = "Please enter your e-mail")]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [Required(ErrorMessage = "Please enter your password")]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}
4

1 に答える 1

1

あなたは非常に正しいことをしていますが、そのように突然、Required注釈の検証メッセージがありますか? それとも、モデルの状態に追加したものに欠けているだけですか? それらすべてに欠落している場合

@Html.Partial("_LoginPartial", new LoginModel())

問題かもしれませんが、@Html.EditorFor代わりに試してみましたか (編集: 部分ビュー_LoginPartialをルート エディター テンプレート フォルダーに移動する必要があることを忘れていました)? パスワードと電子メールにもそれを使用する必要があります。

いずれにせよ、モデル状態に追加されたエラーには MVC が表示する場所がありません@Html.ValidationSummary(true)。特定の検証エラーのみを表示することについて何かを読んだことを覚えていると思います。それを掘り下げることができるかどうか見てみましょうあなたのために

編集:それを見つけたので、その@using(@Html.BeginForm(ようなフォームを手動で配置する代わりに、同様に使用すると、より簡単でRazorフレンドリーになります(後で非常に簡単にajax化できるため、そのようなログフォームに推奨します)

編集 2: ハハこれが私が話していることです、リンク、ここでの回答により、特定のモデル状態エラーが存在する場合はそれを表示できますが、モデル状態に追加するときにキーを与える必要があります

于 2013-08-02T14:58:45.673 に答える