我想在ActionResult
视图中调用以下_Layout
。这些属性将用于控制导航栏上显示的内容:
[ChildActionOnly]
public ActionResult GenerateLayout()
{
var loseATonEvent = db.Events.Max(e => e.EventId);
var currentUser = User.Identity.Name;
currentUser = currentUser.Contains('\\')
? currentUser.Substring(currentUser.LastIndexOf('\\') + 1)
: currentUser;
var layout = new NavigationViewModel
{
IsAdmin = User.IsInRole("ITS-Dept"),
IsSignedUp = ConfirmIsSignedUp(loseATonEvent, currentUser),
CanSignUp = ConfirmCanSignUp(loseATonEvent),
CanWeighIn = ConfirmCanWeighIn(loseATonEvent)
};
return PartialView("_Layout", layout);
}
从我所看到的,为了做到这一点,我需要使用@Html.RenderAction()
。在我的_Layout
视图中,我有以下内容:
@{
Html.RenderAction("GenerateLayout", "Navigation");
}
然而,所有这一切都将创造一个无限循环。我的问题是,我该如何避免这种情况?有没有办法返回这个视图模型?或者有更好的方法来解决这个问题,这样我就不需要在每次加载页面后调用它吗?
答案 0 :(得分:0)
如果您的导航是自包含的,则不要返回_Layout
,而是将导航分成另一部分,然后返回。
您的控制器方法将构建视图模型并返回导航
return PartialView("_Navigation", layout);
_Navigation将包含您的导航标记,并将使用您的视图模型确定需要显示的内容和需要隐藏的内容。
_Layout,而不是必须检索属性并确定需要显示的内容,只需要按原样呈现操作。
答案 1 :(得分:0)
另一种方法是利用“会话”数据来包含您的值,然后根据该数据建立_Layout菜单条件。
例如,当有人登录时......
[HttpPost]
public ActionResult Login(LoginModel model, string returnUrl)
{
// validate user here
if (validUser)
{
var loseATonEvent = db.Events.Max(e => e.EventId);
var currentUser = User.Identity.Name;
Session["isSignedUp"] = ConfirmIsSignedUp(loseATonEvent, currentUser);
Session["canSignUp"] = ConfirmCanSignUp(loseATonEvent);
Session["canWeighIn"] = ConfirmCanWeighIn(loseATonEvent);
// return user to destination URL
return Redirect(returnUrl);
}
}
所以现在我们在条件中使用Session变量来构建我们的导航。
@if (User.Identity.IsAuthenticated && User.IsInRole("ITS-Dept"))
{
// add the nav element here for "ITS-Dept" users
}
@if (User.Identity.IsAuthenticated && Session["isSignedUp"] == "true")
{
// add nav element for this Session val
}
@if (User.Identity.IsAuthenticated && Session["canSignUp"] == "true")
{
// add nav element for this Session val
}
@if (User.Identity.IsAuthenticated && Session["canWeighIn"] == "true")
{
// add nav element for this Session val
}
您只需将这些内容直接添加到_Layout即可。会话变量可以是通用的。