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)
所有内容都编译并运行,但页面标题始终为空.
有谁知道为什么?
您在更新中描述的技术在技术上是可行的。
不幸的是,正如 @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)
| 归档时间: |
|
| 查看次数: |
2404 次 |
| 最近记录: |