如何在每个页面上调用相同的操作?

时间:2015-04-30 20:04:33

标签: c# asp.net asp.net-mvc asp.net-mvc-4 partial-views

我想在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");
}

然而,所有这一切都将创造一个无限循环。我的问题是,我该如何避免这种情况?有没有办法返回这个视图模型?或者有更好的方法来解决这个问题,这样我就不需要在每次加载页面后调用它吗?

2 个答案:

答案 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即可。会话变量可以是通用的。