You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Blazor组件中渲染继承自RazorPage的CSHTML分部视图?

在Blazor组件中渲染MVC Razor分部视图的可行方案

方案一:服务器端Blazor中通过ViewComponent包装调用

仅适用于服务器端Blazor(依赖MVC服务与视图上下文),步骤如下:

  1. 创建ViewComponent包装分部视图:
public class PartialWrapperViewComponent : ViewComponent
{
    // 参数:分部视图名称、传递的模型
    public IViewComponentResult Invoke(string partialViewName, object model)
    {
        return PartialView(partialViewName, model);
    }
}
  1. 在Blazor组件中注入依赖并调用渲染:
@inject IViewComponentHelper ViewComponentHelper
@inject IHttpContextAccessor HttpContextAccessor
@code {
    private string partialHtml;
    private readonly MyModel _model = new MyModel { /* 初始化模型 */ };

    protected override async Task OnInitializedAsync()
    {
        var viewContext = HttpContextAccessor.HttpContext.RequestServices.GetRequiredService<IViewContextAccessor>().ViewContext;
        // 调用ViewComponent,参数对应Invoke方法
        var result = await ViewComponentHelper.InvokeAsync("PartialWrapper", new { partialViewName = "_MyPartial", model = _model });
        // 执行视图结果生成HTML字符串
        var htmlContent = await result.ExecuteAsync(viewContext);
        partialHtml = htmlContent.ToString();
    }
}

@if (!string.IsNullOrEmpty(partialHtml))
{
    @((MarkupString)partialHtml)
}

注意:需在Program.cs中注册IViewContextAccessor服务:services.AddSingleton<IViewContextAccessor, ViewContextAccessor>();

方案二:将CSHTML分部视图迁移为Blazor Razor组件

这是最推荐的长期方案,Blazor与MVC Razor语法高度兼容,迁移成本低:

  • 将CSHTML文件重命名为.razor组件
  • 把@model MyModel替换为Blazor参数:[Parameter] public MyModel Model { get; set; }
  • 替换MVC特有语法:@Html.Partial(...)改为嵌套Blazor组件,@Html.ActionLink(...)改为NavLink,@Html.DisplayFor(...)改为直接绑定属性(如@Model.PropertyName)
  • 原逻辑迁移到Blazor组件的@code块

迁移后直接引用组件即可:

<MyPartial Model="@_model" />

方案三:通过API端点返回分部视图HTML(全Blazor类型兼容)

适用于WASM和服务器端Blazor,通过MVC控制器暴露接口返回HTML,再由Blazor加载渲染:

  1. 创建MVC控制器提供渲染接口:
public class PartialRenderController : Controller
{
    [HttpGet]
    public IActionResult Render(string viewName)
    {
        // 复杂模型建议改用POST方法传递JSON
        var model = new MyModel { /* 初始化或从参数获取 */ };
        return PartialView(viewName, model);
    }
}
  1. 在Blazor组件中获取并渲染HTML:
@inject HttpClient Http
@code {
    private string partialHtml;

    protected override async Task OnInitializedAsync()
    {
        partialHtml = await Http.GetStringAsync("/PartialRender/Render?viewName=_MyPartial");
    }
}

@if (!string.IsNullOrEmpty(partialHtml))
{
    @((MarkupString)partialHtml)
}

注意:使用MarkupString必须确保HTML内容可信,避免XSS攻击。


内容的提问来源于stack exchange,提问作者Валентин Никин

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 02:20:19