Razor Pages - невозможно передать другую модель частичному представлению в обработчике страницы - PullRequest
0 голосов
/ 05 февраля 2019

Я не совсем уверен, возможно ли это сделать, но хотел проверить.У меня есть страница бритвы, которая имеет несколько различных методов обработки.В некоторых из них я возвращаю результат частичного просмотра.

Пример:

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 )быть переданным внутрь.

Я удивлен, что, хотя я явно передаю модель, которая существует, частичное представление все еще ожидает модель страницы вместо модели, которую я явно указал для частичного представления.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Похоже, что это ошибка во вновь введенном Partial() в ASP.NET Core 2.2, где параметр модели кажется полностью избыточным, потому что «это» - единственное, что он примет.

Если вы используете PartialViewResult(), это будет работать.Должно быть проще и более читабельно, чем принятое решение.

Просто поменяйте местами

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

с этим

return new PartialViewResult
{
    ViewName = "_CreateMeetingPartial",
    ViewData = new ViewDataDictionary<ManipulationDto>(ViewData, new ManipulationDto())
};
0 голосов
/ 22 февраля 2019

Чтобы решить вышеуказанную проблему, я должен был сделать ниже.Обратите внимание, что у меня нет атрибута [BindProperty] в моем свойстве ManipulationDto, потому что у меня есть несколько моделей на моей странице.Если у вас есть несколько моделей и у вас есть проверка (например, обязательные свойства), все они сработают на страницах бритвы, которые отличаются от 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
         }
}
...