Я использую новую функцию привязки модели для WebForms, с .NET Framework версии 4.5.1. Я надеюсь достичь, чтобы исключить некоторые двусторонние привязки, основанные на некоторых условиях.
Мне очень нравится (надеюсь, теперь знаменитая) серия блога в блоге Скоттом Гатри. Я реализую страницу редактирования с использованием подхода номер два из привязка модели веб-форм. Часть 3. Обновление и проверка (серия ASP.NET 4.5)
Вот что у меня есть: (упрощено, в ElementEdit.aspx):
<asp:FormView runat="server" ID="FormViewElement" RenderOuterTable="false" DefaultMode="Edit" DataKeyNames="ElementId"
ItemType="Business.Entities.Element"
SelectMethod="GetElement"
UpdateMethod="UpdateElement">
<EditItemTemplate>
<asp:Panel runat="server" DefaultButton="ButtonSpeichern">
<fieldset>
/*some databound controls*/
<asp:Panel runat="server" Visible="<%# !Item.CurrentElementData.SomeCondition() %>">
/*more databound controls*/
</asp:Panel>
/*the submit button ("ButtonSpeichern")*/
</fieldset>
</asp:Panel>
</EditItemTemplate>
</asp:FormView>
Как вы видите, есть условие для видимости на обернутой внутренней панели с помощью "дополнительных элементов управления привязкой". Они должны связываться только, когда conditioni истинно, и они видны. В противном случае они не должны связывать и не изменять значения.
Обновление работает, как в сообщении Скотта (упрощенное, в xxPage.cs), которое является общим базовым классом Type Element:
protected virtual bool UpdateEntity(int id) {
T existing = UseCase.GetItem(id); //gets the original element
TryUpdateModel(existing); //SHOULD NOT update the invisible databound controls, but does
ValidateExistingEntity(existing);
if (ModelState.IsValid) {
UseCase.Update(existing);
return true;
}
ShowErrors(ModelState);
return false;
}
Здесь, после вызова TryUpdateModel()
, невидимые элементы управления обновили модель, чего я хотел избежать.
Как динамически опустить привязку данных для некоторых элементов на основе условия, даже если установка их невидимая не помогает?
UPDATE: Теперь я создаю обходное решение, которое сегодня решает проблему: я просто создал две страницы .aspx со своим соответствующим кодом. В зависимости от того, какие поля пользователь должен успешно редактировать, я вызываю соответствующую страницу в первую очередь.
Это, однако, не решает основной проблемы, которая является условной привязкой данных.