gpt4 book ai didi

asp.net-mvc - ASP.NET MVC 6 中的基本 View 页面

转载 作者:行者123 更新时间:2023-12-03 17:08:59 25 4
gpt4 key购买 nike

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

public String PageTitle { get; set; }
public String PageDescription { get; set; }
public String[] BodyCssClasses { get; set; }

然后在每个 View 上我都会:
@{
PageTitle = "Title ..."
PageDescription" = "Description ..."
BodyCssClasses = new String[] { "main", "home" }
}

在母版页上,我会简单地使用类似的东西:
<title>@Title</title>

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

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

既然没有 Web.Config 怎么能做到这一点?

欢迎任何有关定义页眉信息的更好选项的建议。

更新

我遵循了建议,我正在使用:
public abstract class ViewPageBase<TModel> : RazorPage<TModel> {
public String Title { get; set; }
} // ViewPageBase

然后在 _ViewImports 我有:
@inherits ViewPageBase<TModel>

在 _Layout.cshtml 我有:
<title>@Title</title>

最后在使用该布局的 View 上,我有:
@{
Title = "Page Title";
Layout = "_Layout";
}

一切都编译并运行,但页面标题始终为空。

有谁知道为什么?

最佳答案

您在更新中描述的技术在技术上是可行的。
不幸的是,正如@Peter 所指出的,您获得了一个用于 View 的自定义 ViewPage 实例,以及一个用于布局的不同实例。因为您使用的是两个不同的实例,所以您不能在 View 上设置属性并期望在布局上访问该属性。 这就是您更新后问题的答案:

Everything compiles and runs but the page title is always empty. Doesanyone has any idea why?


@Peter 提供了使用 ViewBag 的解决方法.我想提供一个使用依赖注入(inject)的额外解决方法。
例如,考虑将您的自定义属性放在他们自己的类中,并有自己的接口(interface):
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; }
}
现在,将其注册到 .Net Core 依赖注入(inject)框架。使用 Scoped生命周期,因此每个 Web 请求只会创建一个实例。在原版项目中,这发生在 Startup.cs ,在 ConfigureServices方法:
public void ConfigureServices(IServiceCollection services) {
// Add framework services.
services.AddMvc();
services.AddScoped<IPageMetaData, PageMetaData>();
}
最后,更新您的 _ViewImports.cshtml文件将此对象注入(inject)到您的 View 中:
@inject Your.Namespace.Goes.Here.IPageMetaData MetaData;
现在您的 View 将具有环境 MetaData将对应于 PageMetaData 的每个 Web 请求实例的属性类(class)。您可以从两个 View 和布局中访问它:
@{
// In a view
MetaData.PageTitle = "Set a page title";
}

@* In a layout *@
<title>@MetaData.PageTitle</title>

关于asp.net-mvc - ASP.NET MVC 6 中的基本 View 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32563279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com