私は、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; }
}