これは私が考えすぎている基本的なことかもしれませんが、モデル バインディング エラーが発生しない限り、確実な解決策を見つけることはできないようです。基本的に、この _layout.cshtml マークアップが必要です。
<div class="row">
@Html.Partial("_LoginPartial")
</div>
別のビューへのリンクではなく、私が持っているログインフォームのマークアップを表示するには。_LoginPartial ページのマークアップは、スタートアップ Web サイト テンプレートに付属するものです。
@if (Request.IsAuthenticated)
{
using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-form pull-right" }))
{
@Html.AntiForgeryToken()
<ul class="nav">
<li>
@Html.ActionLink("Hello " + User.Identity.Name + "!", "Manage", "Account", routeValues: null, htmlAttributes: new { title = "Manage" })
</li>
<li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
</ul>
}
}
else
{
@Html.ActionLink("Log in", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })
}
特に、「else」ブランチの行にこのマークアップを表示することを検討しています。
@model Accepted.Web.Models.LoginModel
@if (Request.IsAuthenticated)
{
using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-form pull-right" }))
{
@Html.AntiForgeryToken()
<ul class="nav">
<li>
@Html.ActionLink("Hello " + User.Identity.Name + "!", "Manage", "Account", routeValues: null, htmlAttributes: new { title = "Manage" })
</li>
<li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
</ul>
}
}
else
{
...
}
必要なマークアップを RenderPartial にスローしようとしましたが、強く型付けされているため、別のビューに別のモデルを渡すと、エンジンが文句を言います。強く型付けされたビューがたくさんあり、このログイン/ログアウト マークアップをすべてのページに配置する必要があるため、これは明らかに機能しません。私が持っている要件に適した設計ソリューションはどれですか? 作成するすべてのViewModel にLoginModel.cs を含めますか? 私がその道を行きたいかどうかはわかりません。私が見た別のオプションは、LoginModel を含む BaseViewModel を使用することでした。これは、DRY 原則を維持するのに役立ちますが、KISS に違反する可能性があると感じています。何か案は?