如何/在哪里可以声明像@User这样的对象,以便可以使用@在任何剃刀视图中全局引用它?
类似于:
_LoginPartial.cshtml:
@if(Request.IsAuthenticated) {
<text>Signed In As <strong>@User.Identity.Name</strong> |
但是引用我的对象:
@if(this && that) { <text>@MyObject.GetData</text> }
答案 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;关于它。在这种情况下,User
是System.Web.WebPages.WebPageRenderingBase
抽象类的属性,is used by the view engine将视图呈现为they inherit from it。
我想你可以扩展WebViewPage
或WebViewPage<>
类来为它们添加属性。不过,可能有更好的方法可以实现您尝试做的事情,而无需修改它们。如果您尝试将数据传递给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;
}
这是有效的,也是我用的:)