【问题标题】:How to access Model Property added to ApplicationUser in Layout file如何访问在布局文件中添加到 ApplicationUser 的模型属性
【发布时间】:2017-08-22 17:16:13
【问题描述】:

我是 ASP.Net MVC Web 开发的初学者。我想知道如何在布局文件中访问我的 ApplicationUser 模型中添加的额外属性?

到目前为止,如果我必须访问 razor 文件中的属性,我在 Razor 文件的顶部添加 @model myModel,然后我可以通过 @Model.MyProperty 访问该属性。

假设我在Application User 中添加了FirstName 属性,如下所示:

public class ApplicationUser : IdentityUser
    {
        public string FirstName { get; set; }
    }

现在在我的登录部分中,我有以下代码。

@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{
    using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
    {
    @Html.AntiForgeryToken()

    <ul class="nav navbar-nav navbar-right">
        <li>
            @Html.ActionLink("Hello " + User.Identity.GetUserName() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
        </li>
        <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
    </ul>
    }
}

假设我也想显示 FirstName 而不是 User.Identity.GetUserName() 我该怎么做。

以下是用户在注册过程中将看到的 RegisterViewModel。

 public class RegisterViewModel
    {
        // rest property removed for brevity
        [Required]
        public string FirstName { get; set; }
    }

现在,当返回视图时,RenderBody() 是与该控制器操作相关的实际 CSHTML 文件被渲染的地方。但在我的场景中,我需要在布局文件中访问 applicationUser 的属性,这对所有人来说都是通用的。请指导我。

我可以这样做吗: User.Identity.GetFirstName 或类似的东西?

【问题讨论】:

    标签: c# asp.net-mvc razor asp.net-mvc-5


    【解决方案1】:
    1. 将登录/注销部分放在单独的视图中,而不是在布局视图中。
    2. 然后从布局视图中调用一个操作 (@Html.Action) 以呈现登录/注销部分。 该操作准备登录/注销模型并呈现单独的视图。

    使用这种方法,您可以将模型传递给包含用户特定信息的视图。

    【讨论】:

    • 我认为它需要在布局文件中。因为顶部导航栏需要在每个页面视图中显示。
    • 请再读一遍我写的。然后,您从 布局视图 中调用操作 (@Html.Action)。所以每个页面都包含它。
    • @Html.Action 将如何执行。它是否像局部视图一样呈现没有任何用户操作的内容?那么,即使在页面加载后没有点击,actionlink 也会被执行并且里面的视图会被渲染? “无需点击”??
    • @Html.Action 将在其调用时呈现该特定操作。 “无需点击”。
    【解决方案2】:

    创建一个新控制器,它将成为应用程序中所有控制器的基类(假设您已经在用户实例中保存了名字)

     public class ApplicationBaseController : Controller
            {
                protected override void OnActionExecuted(ActionExecutedContext filterContext)
                {
                    if (User != null)
                    {
                        var context = new ApplicationDbContext();
                        var username = User.Identity.Name;
    
                        if (!string.IsNullOrEmpty(username))
                        {
                            var user = context.Users.SingleOrDefault(u => u.UserName == username);
    
                            ViewData.Add("firstName", user.FirstName);
                        }
                    }
                    base.OnActionExecuted(filterContext);
                }
    
                }
    

    例如 HomeController 继承 ApplicationBaseController 如下:

      public class HomeController : ApplicationBaseController
    

    现在用以下代码更改登录部分:

    @using Microsoft.AspNet.Identity
    @if (Request.IsAuthenticated)
    {
        using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
        {
        @Html.AntiForgeryToken()
    
        <ul class="nav navbar-nav navbar-right">
            <li>
               @Html.ActionLink("Hello " + (ViewData["firstName"]) + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
            </li>
            <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
        </ul>
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      相关资源
      最近更新 更多