这可能是我想多了的基本问题,但如果没有模型绑定错误,我似乎无法找到可靠的解决方案。基本上我想要这个 _layout.cshtml 标记:
<div class="row">
@Html.Partial("_LoginPartial")
</div>
为了显示我拥有的登录表单的标记,而不是指向单独视图的链接。_LoginPartial 页面的标记是启动网站模板附带的:
@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。有任何想法吗?