从剃刀页面处理程序返回部分视图

问题描述 投票:0回答:3

我在从剃刀页面返回部分视图时遇到问题,我的情况是

我有一个局部视图,它是一个表单并且有一个模型。我有 3 个表单驻留在单个 Razor 页面上 表格 A 发布模型 A B 型后模型 B 我的问题是,我想在父页面(即剃刀页面)上处理特定的发布事件。 我如何返回这个部分视图

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

} 

使用剃刀页面可以实现这一点还是不可能? 我只想使用 ajax 返回带有指定模型的局部视图。

asp.net-core razor-pages
3个回答
8
投票
  1. 如您所知,Razor Pages 在

    PartialView
    上没有等效的
    PageModel
    方法。如果您确实想在
    PageModel
    方法中调用不同的部分视图,只需在您中添加
    PartialView
    辅助方法
    PageModel
    :

    [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>

最后,您可以在 PageModel 中返回

PartialView

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="" /> 
}


1
投票

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

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

0
投票

为了复制粘贴目的,方便地结合 @carlin.scott 和 @itminus 的答案,您可以创建此扩展方法:

public static PartialViewResult PartialViewResult<T>(this PageModel page, string viewName, T model)
{
    var resultViewData = new ViewDataDictionary<T>(page.ViewData, model);
    return new PartialViewResult
    {
        ViewName = viewName,
        ViewData = resultViewData,
        TempData = page.TempData
    };
}

或者如果您想将其直接放入派生的 PageModel 中,则使用非扩展版本:

public PartialViewResult PartialViewResult<T>(string viewName, T model)
{
    var resultViewData = new ViewDataDictionary<T>(ViewData, model);
    return new PartialViewResult
    {
        ViewName = viewName,
        ViewData = resultViewData,
        TempData = TempData
    };
}

这样称呼:

return PartialViewResult("_MyPartial", myPartialModel);
© www.soinside.com 2019 - 2024. All rights reserved.