如何使用C#类并在两个cshtml页面之间共享它

如何使用C#类并在两个cshtml页面之间共享它,c#,asp.net,razor,asp.net-webpages,C#,Asp.net,Razor,Asp.net Webpages,我想将ASP.NET应用程序(.aspx)移植到ASP.NET网站[Razor v3](.cshtml),但在两个页面之间共享类变量时遇到问题 很简单的例子。如果我有: public class CompactDisk { public string name; public string artist; public CompactDisk(string n, string a) { name = n; artist = a;

我想将ASP.NET应用程序(.aspx)移植到ASP.NET网站[Razor v3](.cshtml),但在两个页面之间共享类变量时遇到问题

很简单的例子。如果我有:

public class CompactDisk
{
    public string name;
    public string artist;

    public CompactDisk(string n, string a)
    {
        name = n;
        artist = a;
    }
}
我想在
\u AppStart.cshtml
中引用它:

@{
    CompactDisk cd = new CompactDisk("Abbey Road", "The Beatles");
}
我想在两个不同的页面中使用它:

<p>@cd.name - @cd.artist</p>
@cd.name-@cd.artist

共享类变量并从不同页面访问它的最佳方式是什么


抱歉我不知道,我是Razor的新手。

如果类实例不是ViewModel的正式部分(即,是一些“环境信息”,如用户当前登录信息等),则在控制器中创建一个实例,并将值设置到ViewBag中。然后,您可以在Razor页面中作为环境值的松散类型字典访问ViewBag

  • 创建新控制器:
  • 项目/控制器/CompactDiskController.cs

    public class CompactDiskController : Controller
    {
        public CompactDisk Cd { get; }   
    
        public CompactDiskController()
        {
            this.Cd = new CompactDisk("Abbey Road", "The Beatles");
        }
    
        public ActionResult Index()
        {
            return View(this.Cd);
        }
    
        public ActionResult List()
        {
            return View(this.Cd);
        }
    }
    
    public class CompactDisk
    {
        public string name;
        public string artist;
    
        public CompactDisk(string n, string a)
        {
            name = n;
            artist = a;
        }
    }
    
  • 将模型移到下面
  • Project/Models/CompactDisk.cs

    public class CompactDiskController : Controller
    {
        public CompactDisk Cd { get; }   
    
        public CompactDiskController()
        {
            this.Cd = new CompactDisk("Abbey Road", "The Beatles");
        }
    
        public ActionResult Index()
        {
            return View(this.Cd);
        }
    
        public ActionResult List()
        {
            return View(this.Cd);
        }
    }
    
    public class CompactDisk
    {
        public string name;
        public string artist;
    
        public CompactDisk(string n, string a)
        {
            name = n;
            artist = a;
        }
    }
    
  • 在下创建新视图
  • 项目/视图/压缩磁盘

    Index.cshtml

    @model Project.Models.CompactDisk
    
    @{
        ViewBag.Title = "Show from VIEW 1";
    }
    
    <h2>VIEW 1</h2>
    
    @Html.DisplayFor(model => model.name)
    @Html.DisplayFor(model => model.artist)
    
        @model Project.Models.CompactDisk
    
    @{
        ViewBag.Title = "Show from VIEW 2";
    }
    
    <h2>VIEW 2</h2>
    
    @Html.DisplayFor(model => model.name)
    @Html.DisplayFor(model => model.artist)
    
    @model Project.Models.CompactDisk
    @{
    ViewBag.Title=“从视图1显示”;
    }
    视图1
    @DisplayFor(model=>model.name)
    @DisplayFor(model=>model.artist)
    
    List.cshtml

    @model Project.Models.CompactDisk
    
    @{
        ViewBag.Title = "Show from VIEW 1";
    }
    
    <h2>VIEW 1</h2>
    
    @Html.DisplayFor(model => model.name)
    @Html.DisplayFor(model => model.artist)
    
        @model Project.Models.CompactDisk
    
    @{
        ViewBag.Title = "Show from VIEW 2";
    }
    
    <h2>VIEW 2</h2>
    
    @Html.DisplayFor(model => model.name)
    @Html.DisplayFor(model => model.artist)
    
    @model Project.Models.CompactDisk
    @{
    ViewBag.Title=“从视图2显示”;
    }
    视图2
    @DisplayFor(model=>model.name)
    @DisplayFor(model=>model.artist)
    
    您所说的“类变量”是什么意思?你是指类型的实例吗?@Richard这正是我的意思。在控制器中创建实例并作为模型传递给视图。为什么不使用
    public string name{get;set;}模式?不要在视图中创建模型。在MVC中不应该这样做。模型(对象)应该由控制器创建并传递到视图在共享的情况下,只需使用IOC容器并将其注入ConstructorTanks,这正是我想要的。但我有个问题,我不能添加控制器,我在任何地方都没有这个选项,你知道为什么吗?您需要知道您是在开发ASP.NETMVC应用程序还是ASP.NETWebForms应用程序。我的例子是asp.NETMVC。顺便说一句,控制器没有模板,只是添加一个新类并从System.Web.Mvc.ControllerI继承。我正在开发ASP.NET网站(RazorV3),我只能在VS2015oki中添加。Web Api控制器不会帮助您。它用于RESTful响应=>不涉及任何视图。视图用于MVC应用程序。如果要创建Mvc控制器,请创建一个普通类并从System.Web.Mvc.controller继承。您可能还会发现有用的“斯科特·艾伦”优秀视频课程MVC5基础