Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何在razor视图中公开像@User这样的全局对象?_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc 如何在razor视图中公开像@User这样的全局对象?

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登录| 而是引用我的对象: @

如何/在何处声明像@User这样的对象,以便在任何razor视图中使用@全局引用它

类似于:

_LoginPartial.cshtml:

@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布局或其他):

但实际上没有必要,除非在这种情况下您有custome
IPrincipal
对象:

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

这就是我所使用的:)

你是在问如何使用@User?还是在问如何使用@MyOwnObject?作为ASP MVC Razor的新手,我几乎没有想到我可以动态地引入“globals”或使用第二个示例中所示的简单方法将自定义对象添加到视图中。谢谢!“SharedViewPage”未实现继承的抽象成员System.Web.WebPages.WebPageExecutingBase.Execute()