如何在ASP.NET Core 2.1 MVC视图中使用Razor类库?
嘿,我来帮你搞定在ASP.NET Core 2.1 MVC项目里使用Razor类库的问题。你现在的情况是Razor类库里有带@page的Razor Page,但想在MVC视图里复用它的内容,对吧?之前的示例都是针对Razor Pages项目的,那咱们换个思路来适配MVC:
第一步:确保Razor类库的配置没问题
首先检查你的Razor类库的.csproj文件,要确保它启用了MVC支持,这样MVC项目才能识别它的视图。配置应该是这样的:
<Project Sdk="Microsoft.NET.Sdk.Razor"> <PropertyGroup> <TargetFramework>netcoreapp2.1</TargetFramework> <!-- 这个开关是关键,让类库支持MVC视图 --> <AddRazorSupportForMvc>true</AddRazorSupportForMvc> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.0-rc1-final" /> </ItemGroup> </Project>
第二步:调整Razor类库的内容,拆分可复用部分
你现在的Page1.cshtml带@page,它是一个独立的Razor Page,没法直接在MVC视图里当组件用。咱们把可复用的内容拆成部分视图(Partial View):
- 在Razor类库的
Areas/MyFeature/Views/Shared目录下新建一个Page1Partial.cshtml(路径要符合MVC的视图查找规则),内容去掉@page和Layout设置:
@model RazorClassLib1.MyFeature.Pages.Page1Model <h1>Hello From the Razor ClassLib1</h1>
- 原来的
Page1.cshtml可以继续保留,改成引用这个部分视图,这样它作为独立Razor Page也能正常工作:
@page @model RazorClassLib1.MyFeature.Pages.Page1Model @{ Layout = "_Layout"; } <partial name="Page1Partial" model="Model" />
第三步:在MVC视图里引用这个部分视图
现在你可以在MVC项目的任意视图里调用这个部分视图了。比如在Views/Home/Index.cshtml里:
@{ ViewData["Title"] = "Home Page"; } <div class="text-center"> <h1 class="display-4">Welcome</h1> </div> <!-- 直接引用类库中的部分视图,注意路径要写全 --> <partial name="/Areas/MyFeature/Views/Shared/Page1Partial.cshtml" model="@new RazorClassLib1.MyFeature.Pages.Page1Model()" />
(可选)简化视图引用路径
如果不想每次都写完整路径,可以在MVC项目的Startup.cs里配置视图查找规则,让MVC自动找到类库中的视图:
public void ConfigureServices(IServiceCollection services) { services.AddMvc() .AddRazorOptions(options => { // 添加类库的视图位置,让MVC能找到它们 options.ViewLocationFormats.Add("/Areas/{2}/Views/{1}/{0}.cshtml"); options.ViewLocationFormats.Add("/Areas/{2}/Views/Shared/{0}.cshtml"); }); }
配置完之后,就可以直接简化引用:
<partial name="Page1Partial" model="@new RazorClassLib1.MyFeature.Pages.Page1Model()" />
注意事项
- 确保Razor类库中的
Page1Model是public的,这样MVC项目才能访问它。 - 如果你的部分视图需要业务逻辑,记得在模型里处理,或者传递合适的模型实例。
内容的提问来源于stack exchange,提问作者TimHorton
相关产品推荐
相关产品推荐

