如何在布局文件中访问添加到ApplicationUser的Model属性

时间:2017-08-22 04:05:06

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

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

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

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

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 或这些行中的某些内容?

2 个答案:

答案 0 :(得分:0)

  1. 将您的登录/退出部分放在单独的视图中,而不是布局视图中。
  2. 然后从布局视图中调用一个动作(@ Html.Action)来渲染Login / Logout部分。 该操作准备登录/注销模型并呈现单独的视图。
  3. 使用此方法可以将模型传递给包含用户特定信息的视图。

答案 1 :(得分:0)

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

 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>
    }
}