从剃刀页面返回 MVC 视图

时间:2021-07-07 07:15:37

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

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

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

现在,使用剃刀页面如何将相同的逻辑放入 OnGetAsync 方法中.. 尝试过此操作,但无法识别视图..

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

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

          . . .

          return Page();

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

非常感谢您的帮助

2 个答案:

答案 0 :(得分:0)

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

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);
...

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

答案 1 :(得分:0)

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

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();
        }
    }