我是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 或这些行中的某些内容?
答案 0 :(得分:0)
使用此方法可以将模型传递给包含用户特定信息的视图。
答案 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>
}
}