Return razor 页面处理程序的部分视图

Return a partial view from a razor page Handler

我遇到问题return从 razor 页面查看局部视图,我的情况是

我有一个局部视图,它是一个表单并且有一个模型。我有 3 个表格驻留在单个剃刀页面上 Form A post 一个 ModelA 表格 B post 模型 B 我的问题是,我想在作为剃刀页面的父页面上处理他们特定的 post 事件。 我如何 return 这个局部视图

OnPostModelA(ModelA model) 
{
   if(! ModelState.IsValid)
        return Partialview("_CreateModelA", model);

} 

使用 razor pages 这可能吗?还是不可能? 我只想 return 使用 ajax 指定模型的部分视图。

  1. 如您所知,Razor Pages 在 PageModel 上没有等效的 PartialView 方法。如果您确实想在 PageModel 方法中调用不同的局部视图,只需在 PageModel:

    中添加一个 PartialView 辅助方法
    [NonAction]
    public virtual PartialViewResult PartialView(string viewName, object model)
    {
        ViewData.Model = model;
    
        return new PartialViewResult()
        {
            ViewName = viewName,
            ViewData = ViewData,
            TempData = TempData
        };
    }
    

这里我用一个ViewData.Model来存储你的模型对象,假设你的模型类型命名为X1Model:

您可以在部分视图中使用它。

创建一个简单的局部视图,命名为 _CreateModelA.cshtml :

@model HelloModel

AAAAA
<div>
    @Model.Model.Welcome
</div>

和另一个名为 _CreateModelB.cshtml 的局部视图:

@model HelloModel

BBBBBBBB
<div>
    @Model.Model.Welcome
</div>

最后,您可以 return PartialView 在您的 PageModel 中:

public class HelloModel : PageModel
{

    public X1Model Model { get; set; }

    public ActionResult OnGet(int rand = 0)
    {
        var flag = rand % 2 == 0 ? true : false;
        var model = new HelloModel() {
            Model = new X1Model {
                Welcome = "Hello,world",
            }
        }; 
        if (flag)
        {
            return PartialView("_CreateModelA", model);
        }
        else
        {
            return PartialView("_CreateModelB", model);
        }
    }

    [NonAction]
    public virtual PartialViewResult PartialView(string viewName, object model)
    {
        // ...
    }
}

这是截图:

  1. 但是,不建议将部分视图逻辑放在 PageModel 中。如下在页面文件中使用它会更好:

@if(){
    <partial name="" />
}else{
    <partial name="" /> 
}

asp dotnet core 2.2 中,Microsoft 向 PageModel class 添加了一个 Partial 方法,其工作方式类似于 Controller class 上的 PartialView 方法。但是,它不允许您将 ViewData 传递给视图。所以,如果您需要这样做,那么您可以像这样创建自己的 PartialViewResult:

var resultViewData = new ViewDataDictionary<YourModelType>(ViewData, model);
resultViewData[YourViewDataProperty] = yourViewDataValue;
return new PartialViewResult
{
    ViewName = "_Branch",
    ViewData = resultViewData,
    TempData = TempData
};