ASP.NET MVC 6中的基本视图页面

Mig*_*ura 8 asp.net-mvc asp.net-core-mvc

在ASP.NET MVC 5上,我使用了具有一些属性的基本ViewPage:

public String PageTitle { get; set; }
public String PageDescription { get; set; }
public String[] BodyCssClasses { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后在每个视图上我会:

@{
  PageTitle = "Title ..."
  PageDescription" = "Description ..."
  BodyCssClasses = new String[] { "main", "home" }
}
Run Code Online (Sandbox Code Playgroud)

在母版页上,我只想使用如下内容:

<title>@Title</title>
Run Code Online (Sandbox Code Playgroud)

通过这种方法,我能够使用强类型页面属性...

是否可以在ASP.NET MVC 6中使用基本视图页面?

既然没有Web.Config怎么办呢?

欢迎任何有关更好的选项来定义页面头信息的建议.

UPDATE

我按照建议我正在使用:

public abstract class ViewPageBase<TModel> : RazorPage<TModel> {
  public String Title { get; set; }
} // ViewPageBase
Run Code Online (Sandbox Code Playgroud)

然后在_ViewImports我有:

@inherits ViewPageBase<TModel>
Run Code Online (Sandbox Code Playgroud)

在_Layout.cshtml上我有:

<title>@Title</title>
Run Code Online (Sandbox Code Playgroud)

最后在一个使用该布局的视图中:

@{
  Title = "Page Title";
  Layout = "_Layout";
}
Run Code Online (Sandbox Code Playgroud)

所有内容都编译并运行,但页面标题始终为空.

有谁知道为什么?

Chr*_*sen 5

您在更新中描述的技术在技术上是可行的。

不幸的是,正如 @Peter 所指出的,您将获得视图的自定义 ViewPage 的一个实例,以及布局的另一个实例。由于您使用两个不同的实例,因此您无法在视图上设置属性并期望在布局上访问该属性。 这就是您更新的问题的答案:

一切都编译并运行,但页面标题始终为空。有谁知道为什么吗?

@Peter 提供了一种使用ViewBag. 我想提供一种使用依赖注入的额外解决方法。

例如,考虑将自定义属性放置在自己的类中,并具有自己的接口:

public interface IPageMetaData {
    string PageTitle { get; set; }
    string PageDescription { get; set; }
    string[] BodyCssClasses { get; set; }
}

public class PageMetaData : IPageMetaData {
    public string PageTitle { get; set; }
    public string PageDescription { get; set; }
    public string[] BodyCssClasses { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,将其注册到 .Net Core 依赖注入框架。使用Scoped生命周期,因此每个 Web 请求只会创建一个实例。在普通项目中,这发生在Startup.cs, 方法中ConfigureServices

public void ConfigureServices(IServiceCollection services) {
    // Add framework services.
    services.AddMvc();
    services.AddScoped<IPageMetaData, PageMetaData>();
}
Run Code Online (Sandbox Code Playgroud)

最后,更新您的_ViewImports.cshtml文件以将此对象注入您的视图中:

@inject Your.Namespace.Goes.Here.IPageMetaData MetaData;
Run Code Online (Sandbox Code Playgroud)

现在,您的视图将具有一个环境MetaData属性,该属性将对应于该类的每个 Web 请求实例PageMetaData。您可以从两个视图和布局中访问它:

@{
    // In a view
    MetaData.PageTitle = "Set a page title";
}

@* In a layout *@
<title>@MetaData.PageTitle</title>
Run Code Online (Sandbox Code Playgroud)


N. *_*len 1

听起来您正在寻找@inheritsRazor 指令。

例如:

@inherits MyBaseViewPage