Я столкнулся с проблемой, которую я не могу обернуть вокруг. Я использую 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)
, но это также дает ложное значение для проверки модели.
Примечание : я не могу просто разместить свойства объекта снаружи, так как у меня есть другие страницы, где мне нужно сделать это, в которых объекты 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 я предполагаю, что это может отличаться, поскольку действия должны иметь параметры, в отличие от открытых свойств модели страницы на страницах бритвы.