2014-09-22 72 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

相關問題