我正在开发 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();
是否可以在剃刀页面中返回视图 - 我们真的不想创建重复的剃刀页面错误视图,或者尽可能创建某种错误控制器操作。
非常感谢您的帮助
答案 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();
}
}