剃刀页面-无法将不同的模型传递给页面处理程序中的局部视图

时间:2019-02-05 05:57:47

标签: asp.net-mvc razor razor-pages

我不确定是否可以这样做,但想检查一下。我有一个剃刀页面,其中包含一些不同的处理程序方法。在其中一些中,我返回了部分视图结果。

示例:

public class BoardMeetingsModel : PageModel
{ 
      //ctor
      //properties

      public IActionResult OnGetFetchCreateMeetingPartial()
          {
             return Partial("_CreateMeetingPartial", new ManipulationDto());
          }
}

我的局部视图设置如下:

@using Models.ManipulationModels
@model ManipulationDto

这是部分页面,所以我没有使用@page指令(部分页面名为_CreateMeetingPartial.cshtml。尽管当我传入ManipulationModel时,遇到了以下错误

The model item passed into the ViewDataDictionary is of type 'Models.ManipulationDto', but this ViewDataDictionary instance requires a model item of type 'Pages.BoardMeetingsModel'.

我没有在我的剃须刀页面上调用部分页面。我直接返回部分页面,因为我在javascript模态中使用了返回的数据。甚至有可能覆盖此行为?默认情况下,它始终希望传入基数PageModel(即 BoardMeetingsModel )。

令我感到惊讶的是,即使我显式传递了一个存在的模型,局部视图仍然期望使用pagemodel而不是我为局部视图明确声明的模型。

2 个答案:

答案 0 :(得分:2)

要解决以上问题,我必须做以下事情。请注意,我的ManipulationDto属性没有[BindProperty]属性,因为我的页面上有多个模型。如果您有多个模型并且具有验证(例如必需的属性),则所有这些模型都会在与MVC不同的剃须刀页面中触发。在我的情况下,处理它的方法是直接将模型作为参数传递,但还要确保具有一个公共属性,以防万一模型状态验证失败时可以分配所有值。

如果您没有多个唯一的模型,每个模型都有自己的验证,则只需应用bindproperty属性,不必担心。

public class BoardMeetingsModel : PageModel
{ 
      //this gets initialized to a new empty object in the constructor (i.e. MeetingToManipulate = new ManipulationDto();)
      public ManipulationDto MeetingToManipulate { get; set; }

      //ctor
      //properties

      public IActionResult OnGetFetchCreateMeetingPartial(ManipulationDto meetingToManipulate)
          {
             //send the page model as the object as razor pages expects 
             //the page model as the object value for partial result
             return Partial("_CreateMeetingPartial", this);
          }

      public async Task<IActionResult> OnPostCreateMeetingAsync(CancellationToken cancellationToken, ManipulationDto MeetingToCreate)
        {
            if (!ModelState.IsValid)
            {
                //set the pagemodel property to be the values submitted by the user
                //not doing this will cause all model state errors to be lost
                this.MeetingToManipulate = MeetingToCreate;
                return Partial("_CreateMeetingPartial", this);
            }
            //else continue
         }
}

答案 1 :(得分:0)

这似乎是ASP.NET Core 2.2中新引入的Partial()中的错误,其中模型参数似乎是完全多余的,因为“ this”是它唯一会接受的东西。

如果您使用PartialViewResult(),它将起作用。比公认的解决方案更简单,更易读。

只需交换此

return Partial("_CreateMeetingPartial", new ManipulationDto());

与此

return new PartialViewResult
{
    ViewName = "_CreateMeetingPartial",
    ViewData = new ViewDataDictionary<ManipulationDto>(ViewData, new ManipulationDto())
};