Asp.net mvc 如何在razor视图中公开像@User这样的全局对象?
如何/在何处声明像@User这样的对象,以便在任何razor视图中使用@全局引用它 类似于: _LoginPartial.cshtml:Asp.net mvc 如何在razor视图中公开像@User这样的全局对象?,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,如何/在何处声明像@User这样的对象,以便在任何razor视图中使用@全局引用它 类似于: _LoginPartial.cshtml: @if(Request.IsAuthenticated) { <text>Signed In As <strong>@User.Identity.Name</strong> | @if(Request.IsAuthenticated){ 以@User.Identity.Name登录| 而是引用我的对象: @
@if(Request.IsAuthenticated) {
<text>Signed In As <strong>@User.Identity.Name</strong> |
@if(Request.IsAuthenticated){
以@User.Identity.Name登录|
而是引用我的对象:
@if(this && that) { <text>@MyObject.GetData</text> }
@if(this&&that){@MyObject.GetData}
您可以将剃须刀页面的基本类型更改为您自己的页面类型,例如:
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>
@if(Request.IsAuthenticated) {
<text>Signed In As <strong>@User().Identity.Name</strong>
可以这样使用:
<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>
@if(Request.IsAuthenticated) {
<text>Signed In As <strong>@User().Identity.Name</strong>
@if(Request.IsAuthenticated){
以@User()身份登录。Identity.Name
就我个人而言,我更喜欢第一种方法,但我认为应该提供第二种方法作为替代选项。语法并没有以任何方式引用值,它只是告诉视图引擎您正在开始一个服务器端代码块 它没有任何“全局性”。在本例中,
User
是System.Web.WebPages.webagerenderingbase
抽象类上的一个属性,在呈现视图时,该属性为
我想您可以扩展WebViewPage
或WebViewPage
类来为它们添加属性。不过,可能有更好的方法可以实现您尝试的操作,而无需修改这些属性。如果您试图将数据传递给视图,该数据不应该是ViewModel的一部分吗
理想情况下,您应该在自定义视图模型中提供视图所需的一切,并且视图将继承自WebViewPage
在Razor语法中,我认为您应该以如下内容开始CSHTML:
@model CustomViewModel
然后,您可以使用模型
属性访问该模型的属性:
@Model.SomeProperty
在您看来,您可能可以这样做:
@Html.ViewContext.HttpContext.User.Identity.Name
但是,我建议不要这样做,并将此信息添加到ViewModel中。例如:
public ActionResult SomeController()
{
var model = new MyViewModel
{
Username = User.Identity.Name
}
return View(model);
}
现在,您可以在视图中显示以下信息:
@Model.Username
或者,对于不那么突兀的方法,这适用于任何Razor页面,只是默认设置:
@Context.User.Identity.IsAuthenticated
如果愿意,可以在Razor文件的顶部设置快速变量别名(\u布局或其他):
但实际上没有必要,除非在这种情况下您有customeIPrincipal
对象:
@{
var User = (MyAuthenticatedUser)Context.User;
}
这就是我所使用的:)你是在问如何使用@User?还是在问如何使用@MyOwnObject?作为ASP MVC Razor的新手,我几乎没有想到我可以动态地引入“globals”或使用第二个示例中所示的简单方法将自定义对象添加到视图中。谢谢!“SharedViewPage”未实现继承的抽象成员System.Web.WebPages.WebPageExecutingBase.Execute()