如何在剃刀视图中公开像@User这样的全局对象?

时间:2011-12-20 17:45:49

标签: asp.net-mvc asp.net-mvc-3

如何/在哪里可以声明像@User这样的对象,以便可以使用@在任何剃刀视图中全局引用它?

类似于:

_LoginPartial.cshtml:

@if(Request.IsAuthenticated) {
    <text>Signed In As  <strong>@User.Identity.Name</strong> |

但是引用我的对象:

  @if(this && that) { <text>@MyObject.GetData</text> }

4 个答案:

答案 0 :(得分:27)

您可以将Razor页面的基本类型更改为您自己的基本类型,例如:

public class UserAwareViewPage : System.Web.Mvc.WebViewPage
{
  public IPrincipal User { get { return Thread.CurrentPrincipal; } }
}

然后像这样修改配置文件:

<system.web.webPages.razor>
  <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, 
  System.Web.Mvc, Version=3.0.0.0, 
  Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  <pages pageBaseType="Your.Namespace.UserAwareViewPage">
    <namespaces>
      <add namespace="System.Web.Mvc" />
      <add namespace="System.Web.Mvc.Ajax" />
      <add namespace="System.Web.Mvc.Html" />
      <add namespace="System.Web.Routing" />
    </namespaces>
  </pages>
</system.web.webPages.razor>

Phil Haack非常出色blog post on this here

或者,您可以将扩展方法添加到System.Web.Mvc.WebViewPage(剃刀页面的基本类型)并使用它。

public static IPrincipal User(this System.Web.Mvc.WebViewPage page)
{
  return Thread.CurrentPrincipal;
}

哪个可以这样使用:

@if(Request.IsAuthenticated) {
<text>Signed In As  <strong>@User().Identity.Name</strong>

就个人而言,我更喜欢第一种方法,但我认为我会提供第二种选择。

答案 1 :(得分:4)

@语法不以任何方式引用值,它只是告诉视图引擎您正在开始服务器端代码块。

没有什么&#34;全球&#34;关于它。在这种情况下,UserSystem.Web.WebPages.WebPageRenderingBase抽象类的属性,is used by the view engine将视图呈现为they inherit from it

我想你可以扩展WebViewPageWebViewPage<>类来为它们添加属性。不过,可能有更好的方法可以实现您尝试做的事情,而无需修改它们。如果您尝试将数据传递给View,那么该数据是否应该成为ViewModel的一部分?

理想情况下,您可以在自定义ViewModel中提供View所需的所有内容,而View将从WebViewPage<CustomViewModel>继承。

在Razor语法中,我认为你可以用以下内容开始CSHTML:

@model CustomViewModel

然后,您使用Model属性访问该属性:

@Model.SomeProperty

答案 2 :(得分:2)

您可以在视图中执行以下操作:

@Html.ViewContext.HttpContext.User.Identity.Name

但我建议不要这样做,并将此信息添加到ViewModel。例如:

public ActionResult SomeController()
{
    var model = new MyViewModel
    {
        Username = User.Identity.Name
    }
    return View(model);
}

现在,您可以在视图中显示以下信息:

@Model.Username

答案 3 :(得分:2)

或者对于不太突兀的方法,这适用于任何Razor页面,只是默认值:

@Context.User.Identity.IsAuthenticated

如果你喜欢Razor文件的顶部(_Layout或其他),你肯定可以设置一个快速变量别名:

@{
  var User = Context.User;
}

但除非你在这种情况下有一个客户IPrincipal对象,否则真的没必要:

@{
  var User = (MyAuthenticatedUser)Context.User;
}

这是有效的,也是我用的:)