2

これは私が考えすぎている基本的なことかもしれませんが、モデル バインディング エラーが発生しない限り、確実な解決策を見つけることはできないようです。基本的に、この _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 に違反する可能性があると感じています。何か案は?

4

1 に答える 1