2014-09-22 68 views
1

平时_LoginPartial.cshtml旁边:上LoginPartial视图中使用自定义值,而不是User.Identity.Name

Hello, @Html.ActionLink(User.Identity.Name, "Manage", "Account", routeValues: null, htmlAttributes: new { @class = "username", title = "Manage" })! 

我想使用自定义字段从LoginModel模型代替User.Identity.Name。 我该怎么做?

或者是有可能设置为User.Identity.Name东西比其他登录?

+0

在控制器中的任何'model属性中设置'my.prop',然后在'actionlink'中使用'@ Model.myprop'来设置User.Identity.Name'。 – 2014-09-22 12:13:35

回答

7

对于全局的东西,比如你的布局,你应该使用一个子动作,如果你还没有。尝试为每个视图单独填充ViewBag变量只会导致失败,因为您将不可避免地忘记,或者一些新的开发人员不会知道这样做。

与孩子的动作,你可以通过任何你喜欢的模型,您的局部视图,从而使您能够真正从持久性存储查找你的用户,并使用你喜欢它的任何属性的能力。

[ChildActionOnly] 
public ActionResult LoginPartial() 
{ 
    // ASP.NET Identity 
    var user = UserManager.FindById(User.Identity.GetUserId()); 

    // Membership 
    // var user = db.UserProfiles.SingleOrDefault(m => m.UserName == User.Identity.Name); 

    return PartialView("_LoginPartial", user); 
} 

然后在你的局部视图,用于身份:

@model Namespace.To.ApplicationUser 

或者与会员

@model Namespace.To.UserProfile 

而且,继续谈到任何性质关闭你喜欢的用户实例。

要调用子操作在布局:

@Html.Action("LoginPartial", "Account") 

(我假定你已经到位儿童行动在AccountController,这似乎是最合理的地方)

+0

+1伟大的解决方案!我正在使用这种方法来显示左侧菜单中未完成订单的数量。谢谢克里斯。 – ekad 2014-09-22 16:45:47

+0

这使得HTTP错误404.15 - 找不到或更好的调用时用户没有通过验证,不知道为什么,但似乎登录(字符串RETURNURL)被称为在深循环,直到,直到极限达到 – 2016-12-06 01:59:26

+0

@CesarRomeroo RequestFilteringModule溢出:确保子动作或者用[AllowAnonymous]标记,或者在没有用[Authorize]修饰的控制器中。否则,子动作本身将需要授权,如果它是布局的一部分,则尝试加载登录页面进行授权将会创建一个重定向循环。 – 2016-12-06 15:51:54

2

您可以使用ViewBag将信息从Controller动作传递到视图。因此您可以在基础控制器中创建一个从Controller继承的基础控制器,并在OnActionExecuting中设置ViewBag。所有其他控制器都可以从基础控制器继承。

然后,您可以在布局或任何其他partialview中使用Viewbag。

+1

尽管这种方法可以正常工作,但建议在这些情况下使用子操作。如果您依靠基础控制器为其布局提供所需的特定数据,那么所有时间的所有控制器都必须从该基础继承。如果你忘记了,或者有新的开发者出现,他不知道他/她需要从这个基础继承,那么事情就会变得复杂起来,为什么没有明显的原因。 – 2014-09-22 13:17:44

相关问题