2

这可能是我想多了的基本问题,但如果没有模型绑定错误,我似乎无法找到可靠的解决方案。基本上我想要这个 _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。有任何想法吗?

4

1 回答 1

2

您可以使用RenderAction并让控制器创建一个 ViewModel:

public class CommonController : Controller
{
    public ActionResult LoginForm()
    {
        var model = new LoginModel();
        return PartialView("_LoginPartial", model);
    }
}

然后RenderAction在中使用_Layout.cshtml

@{ Html.RenderAction("LoginPartial", "Common"); }

这种方法会导致一些开销,因为它必须通过控制器管道,但我认为它可以忽略不计。

注意:我冒昧地为控制器命名Common,但这当然可以是任何名称。

于 2013-10-29T15:21:11.797 回答