【问题标题】:Return MVC view from razor page从剃刀页面返回 MVC 视图
【发布时间】:2021-07-07 07:15:37
【问题描述】:

我正在开发 ASP.NET Core 3.1。 MVC Web 应用程序,我们希望开始将剃刀页面合并到其中的某些页面(或所有页面)。我们有一个当前在控制器中使用的标准错误视图,例如

if (!project.IsValid)
{
  return View("Error", project.Error.Message);
}

现在,使用剃须刀页面,我怎样才能将相同的逻辑放入 OnGetAsync 方法中..尝试了这个,但 View 无法识别..

public async Task<IActionResult> OnGetAsync(string id)
        {
          var project = await _projectRepo.GetById(id);

          if (!project.IsValid)
          {
            return View("Error", project.Error.Message);
          }

          . . .

          return Page();

是否可以在 razor 页面中返回视图 - 我们真的不想创建重复的 razor 页面错误视图,或者如果可能的话创建某种错误控制器操作。

非常感谢您的帮助

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core .net-core razor-pages


    【解决方案1】:

    对于其他人,我通过创建此扩展方法使其工作:

    public static ViewResult View<TModel>(this PageModel pageModel, string viewName, TModel model) {
                var viewDataDictionary = new ViewDataDictionary<TModel>(new EmptyModelMetadataProvider(), new ModelStateDictionary()) {
                    Model = model
                };
                foreach (var kvp in pageModel.ViewData)
                        viewDataDictionary.Add(kvp);
    
                return new ViewResult {
                    ViewName = viewName,
                    ViewData = viewDataDictionary,
                    TempData = pageModel.TempData
                };
            }
    

    然后在剃须刀页面处理程序方法中使用..

    ...
    return this.View("MvcViewName", model);
    ...
    

    虽然不知道如何测试这个扩展方法,所以欢迎任何帮助

    【讨论】:

    • 正是我需要的,谢谢!
    【解决方案2】:

    我将我的错误视图渲染成一个字符串

    public static async Task<string> RenderPartialViewToString(this Controller value, string viewName, object model)
        {
            if (string.IsNullOrEmpty(viewName)) { viewName = value.ControllerContext.ActionDescriptor.ActionName; }
    
            value.ViewData.Model = model;
    
    
    
    
            IViewEngine viewEngine = value.ControllerContext.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine;
    
            using (var writer = new StringWriter())
            {
                ViewEngineResult viewResult = viewEngine.FindView(value.ControllerContext, viewName, false);
    
                ViewContext viewContext = new ViewContext(
                    value.ControllerContext,
                    viewResult.View,
                    value.ViewData,
                    value.TempData,
                    writer,
                    new HtmlHelperOptions()
                );
    
                await viewResult.View.RenderAsync(viewContext);
    
                return writer.GetStringBuilder().ToString();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2019-02-02
      • 2020-01-26
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      • 2018-04-24
      • 1970-01-01
      相关资源
      最近更新 更多