【问题标题】:Return a partial view from a razor page Handler从剃刀页面处理程序返回部分视图
【发布时间】:2019-02-02 09:21:28
【问题描述】:

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

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

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

} 

这是否可以使用剃须刀页面,或者这是不可能的? 我只想使用ajax返回带有指定模型的部分视图。

【问题讨论】:

    标签: asp.net-core razor-pages


    【解决方案1】:
    1. 如您所知,Razor 页面在 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>
    

    最后,您可以在 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="" /> 
    }

    【讨论】:

    • 我知道剃须刀页面没有部分回报。我正在考虑这项工作,但我不知道如何按照您的方式绑定模型。
    • 我不知道如何按照您的方式绑定模型。肯定会尝试一下
    • @EduCielo ,PageModel 有一个 Model 属性来存储将在您的局部视图中使用的模型。当通过 PartialView(viewname , pagemodel) 调用局部视图时,我们会将 PageModel 传递给局部视图.因此,您可以通过YourPageModel.Model.xx 以强类型的方式检索模型。
    • 知道了。这是一个很好的解决方法。我在剃刀文档中查看这种情况,因为它很有可能发生但无济于事。谢谢老哥
    • @EduCielo,我很高兴听到它有帮助。如果您发现我的解决方法有效,请您将我的回复标记为答案。它也将帮助其他有同样疑问的人快速找到答案。非常感谢。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 2018-04-24
      • 2021-12-22
      • 2018-08-17
      • 2022-01-19
      • 2011-10-10
      相关资源
      最近更新 更多