C# 我怎样才能把asp.net放进去;“登录”;在布局页面上查看,而不是@Html.Actionlink到单独的登录页面?

C# 我怎样才能把asp.net放进去;“登录”;在布局页面上查看,而不是@Html.Actionlink到单独的登录页面?,c#,.net,asp.net-mvc,asp.net-mvc-4,asp.net-mvc-partialview,C#,.net,Asp.net Mvc,Asp.net Mvc 4,Asp.net Mvc Partialview,这可能是我过度思考的一些基本问题,但我似乎无法找到一个没有模型绑定错误的可靠解决方案。基本上我想要这个_layout.cshtml标记: <div class="row"> @Html.Partial("_LoginPartial") </div> @Html.Partial(“_LoginPartial”) 显示登录表单的标记,而不是指向单独视图的链接。_LoginPartial页面的标记是启动网站模板附带的: @if (Reque

这可能是我过度思考的一些基本问题,但我似乎无法找到一个没有模型绑定错误的可靠解决方案。基本上我想要这个_layout.cshtml标记:

    <div class="row">
        @Html.Partial("_LoginPartial")
    </div>

@Html.Partial(“_LoginPartial”)
显示登录表单的标记,而不是指向单独视图的链接。_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" })
}
@if(Request.IsAuthenticated)
{
使用(Html.BeginForm(“注销”、“帐户”、FormMethod.Post、新的{id=“logoutForm”、@class=“navbar form pull right”}))
{
@Html.AntiForgeryToken()
  • @ActionLink(“Hello”+User.Identity.Name+”!,“Manage”,“Account”,routeValue:null,htmlAttributes:new{title=“Manage”})
} } 其他的 { @ActionLink(“登录”、“登录”、“帐户”、routeValue: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
{
    ...
}
@model Accepted.Web.Models.LoginModel
@如果(请求已验证)
{
使用(Html.BeginForm(“注销”、“帐户”、FormMethod.Post、新的{id=“logoutForm”、@class=“navbar form pull right”}))
{
@Html.AntiForgeryToken()
  • @ActionLink(“Hello”+User.Identity.Name+”!,“Manage”,“Account”,routeValue:null,htmlAttributes:new{title=“Manage”})
} } 其他的 { ... }

我试图在RenderPartial中抛出我想要的标记,但由于它是强类型的,如果我将不同的模型传递给另一个视图,引擎会发出抱怨。这显然是行不通的,因为我将有很多强类型的视图浮动,并且这个登录/注销标记需要出现在每个页面上。什么设计方案可以满足我的需求?是否在我创建的每个ViewModel中都包含LoginModel.cs?我不确定我是否愿意走那条路。我看到的另一个选择是使用带有LoginModel的BaseViewModel,这有助于保持干燥原则,但我觉得这可能违反了KISS。有什么想法吗?

您可以使用
RenderAction
并让控制器创建一个视图模型:

public class CommonController : Controller
{
    public ActionResult LoginForm()
    {
        var model = new LoginModel();
        return PartialView("_LoginPartial", model);
    }
}
然后在
\u Layout.cshtml
中使用
RenderAction

@{ Html.RenderAction("LoginPartial", "Common"); }
这种方法会导致一些开销,因为它必须通过控制器管道,但我认为它可以忽略不计


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

感谢您的回复,让我快速测试一下。为了确保我理解这里的语义,CommonController是一种可以满足此类需求的通用控制器?@davidisawesome是的,正如名字所说,您可以将其用于网站上的通用组件。登录表单、(子)菜单、面包屑等,但我认为在
UserAccountController
中放置这样的登录也很好。太好了!这很有魅力。喜欢这里的简单,+10分为你好先生。@davidesawesome不错,很高兴我能帮上忙!当视图中有可重用的逻辑时,我通常使用这种方法。