Почему UpdateMethod в ObjectDataSource получает значения свойств только из видимых элементов управления в DetailsView? - PullRequest
2 голосов
/ 26 марта 2010

Я написал класс, который содержит методы выбора и обновления для ObjectDataSource. UpdateMethod получает экземпляр вызываемого класса. Моя проблема в том, что установлены только те свойства, которые связаны в DetailsView, остальные имеют значение по умолчанию.

Вот мой код:

Объявление класса :

public class Foo
{
  public string Prop1 {get;set:}
  public int Prop2 {get;set;}
}

Updatemethod :

[DataObjectMethod(DataObjectMethodType.Update)]
public static void UpdateQuicklink(Foo item)
{
//  item.Prop1 // contains correct value
// item.Prop2 // is 0
}

Разметка

<asp:DetailsView ID="DetailsView1" runat="server" 
    DataSourceID="ods" EnableModelValidation="True" AutoGenerateInsertButton="True"
    AutoGenerateRows="False" AutoGenerateEditButton="True">
    <Fields>
        <asp:BoundField DataField="Prop1"/>
        <asp:BoundField DataField="Prop2" Visible="false"/>
    </Fields>
</asp:DetailsView>
<asp:ObjectDataSource ID="ods" runat="server"
    TypeName="NamespaceToClassContaingUpdateMethod"
    OldValuesParameterFormatString="original_{0}" 
    DataObjectTypeName="NamespaceToFoo" 
    UpdateMethod="UpdateQuicklink">
</asp:ObjectDataSource>

Я не могу выставить все поля, которые мне нужны, в разметке.
Возможным решением было бы переписать мой UpdateMethod, чтобы принять все необходимые параметры, например:

[DataObjectMethod(DataObjectMethodType.Update)]
public static void UpdateQuicklink(string Prop1, int Prop2)
{

}

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

1 Ответ

4 голосов
/ 26 марта 2010

Кажется, что значения невидимого DataControlFields (например, BoundField) не включены в ViewState и, следовательно, не сохраняются во время приема-передачи Здесь - обсуждение проблемы. Рекомендация Microsoft здесь заключается в добавлении имени поля для невидимых полей в свойство DataKeyNames элемента управления с привязкой к данным. Затем вы можете удалить невидимое поле из коллекции Fields:

<asp:DetailsView ID="DetailsView1" runat="server" 
    DataSourceID="ods" EnableModelValidation="True" AutoGenerateInsertButton="True"
    AutoGenerateRows="False" AutoGenerateEditButton="True"
    DataKeyNames="Prop2">
    <Fields>
        <asp:BoundField DataField="Prop1"/>
    </Fields>
</asp:DetailsView>

Это не обязательно для элементов управления в шаблоне - например, TextBox в EditItemTemplate FormView, который связан с использованием Text='<%# Bind("Prop2") %>'. Здесь ViewState сохраняется во время обходов даже для невидимого TextBox (если, конечно, вы не отключите ViewState).

...