Razor Pages - проверка модели не удалась из-за нескольких параметров совместного использования объектов - PullRequest
0 голосов
/ 07 января 2019

Я столкнулся с проблемой, которую я не могу обернуть вокруг. Я использую Razor Pages и имею два объекта, которые могут быть связаны.

[BindProperty]
public MeetingMinuteInputDto MeetingToCreate { get; set; }

[BindProperty]
public MeetingMinuteUpdateDto MeetingToUpdate { get; set; }

Выше двух отдельных dto для создания / обновления базовой сущности в моей базе данных. У меня есть два отдельных dto, потому что я разрешаю обновлять только определенные элементы (чтобы не допустить перепост). Оба класса имеют Name, Date и Reminder. MeetingMinuteUpdateDto позволяет изменять только Date.

Свойство Name является обязательным и не может быть нулевым. Причина, по которой у меня есть оба объекта на одной странице / контроллере, заключается в том, что я использую модалы для создания / обновления, и я бы не хотел создавать несколько страниц только для создания / редактирования объектов.

У меня есть две формы, которые пользователи могут заполнить - одну для редактирования и одну для создания. Каждый из них привязывает значения к определенному объекту (т. Е. Форма создания будет связывать свои опубликованные значения формы с MeetingMinuteInputDto).

<div class="form-group">
    <div class="col-md-10">
          <label asp-for="MeetingToCreate.Name" class="control-label"></label>
          <input asp-for="MeetingToCreate.Name" class="form-control" />
          <span asp-validation-for="MeetingToCreate.Name" class="text-danger"></span>
      </div>
</div>

Выше приведен образец моей формы для создания новой встречи. Я проверил, чтобы при отправке формы связывалось только значение MeetingMinuteInputDto. Другой объект (MeetingMinuteUpdateDto) имеет нулевые значения для всех своих свойств.

Но когда я проверяю состояние модели, MVC выдает ошибку в свойстве «Имя», говоря, что оно пустое. Я посмотрел на результаты состояния модели, и есть ключ с именем «Имя», который не привязан ни к какому объекту, который не проходит проверку.

Если я удаляю другой объект (т. Е. Удаляю MeetingMinuteUpdateDto) со страницы и выполняю привязку модели, все работает правильно. Как предотвратить проверку модели на попытку проверить объекты, не относящиеся к текущему действию? Я хочу, чтобы действие Create только проверяло объект create, и наоборот.

Я пытался сделать TryValidateModel(MeetingToCreate), но это также дает ложное значение для проверки модели.

enter image description here

Примечание : я не могу просто разместить свойства объекта снаружи, так как у меня есть другие страницы, где мне нужно сделать это, в которых объекты update / create имеют более 10 свойств, которые являются общими или не общими.


Обновление - Я могу вручную удалить ошибку проверки из словаря состояния модели. Но мне не очень нравится такой подход, так как я не хочу перебирать все свойства неправильных ключей и удалять их.


Обновление 2 : Подробнее об этой проблеме:

public class MeetingMinuteInputDto: MeetingMinuteManipulationDto
    {
        public string AdditionalInfo { get; set; }
    }

public class MeetingMinuteUpdateDto : MeetingMinuteManipulationDto
    {
    }

public class MeetingMinuteManipulationDto
    {
        [Required]
        public string Name { get; set; }
        public IFormFile FileToUpload { get; set; }
    }

На моей странице Razor у меня есть оба эти свойства с атрибутом свойства bind:

public class MeetingMinutesModel : PageModel
    {
        [BindProperty]
        public MeetingMinuteInputDto MeetingToCreate { get; set; }

        [BindProperty]
        public MeetingMinuteUpdateDto MeetingToUpdate { get; set; } 
        //...stuff
}

Моя форма на странице создания / редактирования выглядит так:

<form asp-page="/MeetingMinute/MeetingMinutes" asp-page-handler="CreateMeeting">
    <div class="form-group">
        <div class="col-md-10">
              <label asp-for="MeetingToCreate.Name" class="control-label"></label>
              <input asp-for="MeetingToCreate.Name" class="form-control" />
              <span asp-validation-for="MeetingToCreate.Name" class="text-danger"></span>
          </div>
    </div>
    //other inputs and label for rest of the properties
   <button type="submit" class="btn btn-danger">Submit</button>
</form>

Вход для формы установлен специально для привязки к свойству MeetingToCreate . Когда я отправляю форму, значения формы правильно связаны. Но в то же время я получаю ошибки ModelState для свойства MeetingToUpdate (поскольку некоторые поля совпадают с MeetingToCreate).

Я предполагаю, что на странице Razor проверка состояния модели проверяет MeetingMinutesModel , а не отдельные свойства MeetingToCreate/MeetingToUpdate. В MVC я предполагаю, что это может отличаться, поскольку действия должны иметь параметры, в отличие от открытых свойств модели страницы на страницах бритвы.

1 Ответ

0 голосов
/ 10 января 2019

На страницах Razor @model на странице - PageModel , а свойство «Имя» класса MeetingMinuteManipulationDto - Required, поэтому проверка состояния модели проверяет все свойства в PageModel. Если вы настаиваете на оригинальной идее, вы можете попытаться использовать ViewComponent для реализации создания / редактирования объектов в том же виде бритвы.

...