2016-04-27 5 views
7

Próbuję utworzyć witrynę danych dynamicznych, która powinna umożliwić administratorowi bezpośrednią edycję danych w większości tabel w bazie danych."Typ klucza OR sortowane według kolejności musi być porównywalny do zamówienia" z danymi dynamicznymi

Do tej pory mam klasy EDMX i POCO, wszystkie dołączone do interfejsu używanego do zastosowania DataAnnotations na polach.
Chcę mieć edytowalną siatkę dla każdej tabeli, więc edytowałem szablon ListDetails i postępowałem zgodnie z these instructions, który pozwala mi mieć wbudowaną edycję w ListView.
Dzięki tym wszystkim mogę wyświetlać i edytować dane. To działa.

Ale kiedy klikam na nagłówku (jest to LinkButton z komendą Sort i nazwą kolumny jako CommandArgument) kolumny ForeignKey, zawsze otrzymuję następujący wyjątek (ale sortowanie działa na "prostych" właściwościach):

[Wyjątek EntitySqlException: Typ sortowania kluczy ORDER musi być zgodny z porządkiem na poziomie . Blisko ekspresji użytkownik dostępu, wiersz 6, kolumna 3.]
Microsoft.AspNet.EntityDataSource.EntityDataSourceView.ExecuteSelect (DataSourceSelectArguments argumentów) +1325
System.Web.UI.DataSourceView.Select (DataSourceSelectArguments argumentów DataSourceViewSelectCallback zwrotnego) + 21
System.Web.UI.WebControls.DataBoundControl.PerformSelect() +138
System.Web.UI.WebControls.ListView.PerformSelect() +167
System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +30
System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +105 System.W eb.UI.WebControls.BaseDataBoundControl.OnPreRender (EventArgs e) +22 System.Web.UI.Control.PreRenderRecursiveInternal() +83
System.Web.UI.Control.PreRenderRecursiveInternal() +155
system.Web. UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Page.ProcessRequestMain (Boolean w tym udeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +974

Przykład tabeli próbuję wyświetlić i sort (jestem wyświetlanie i edytowanie LINK_ENTITES_MODELISEES próbuję uporządkować na kolumnie LOV_LOB):

[MetadataType(typeof(ILINK_ENTITES_MODELISEES_MetaData))] 
public partial class LINK_ENTITES_MODELISEES : ILINK_ENTITES_MODELISEES_MetaData 
{ 
    public int id_entite_modelisee { get; set; } 
    public short id_entite { get; set; } 
    public short id_lob { get; set; } 
    public System.DateTime date_val_debut { get; set; } 
    public System.DateTime date_val_fin { get; set; } 

    public virtual LOV_ENTITE LOV_ENTITE { get; set; } 
    public virtual LOV_LOB LOV_LOB { get; set; } 
} 

public partial interface ILINK_ENTITES_MODELISEES_MetaData 
{ 
    [Key] 
    [Required(ErrorMessage = "id_entite_modelisee is required")] 
    int id_entite_modelisee { get; set; } 

    [Required(ErrorMessage = "id_entite is required")] 
    short id_entite { get; set; } 

    [Required(ErrorMessage = "id_lob is required")] 
    short id_lob { get; set; } 

    [Required(ErrorMessage = "date_val_debut is required")] 
    [DataType(DataType.Date)] 
    System.DateTime date_val_debut { get; set; } 

    [Required(ErrorMessage = "date_val_fin is required")] 
    [DataType(DataType.Date)] 
    System.DateTime date_val_fin { get; set; } 

    [Display(Name = "entite")] 
    LOV_ENTITE LOV_ENTITE { get; set; } 

    [Display(Name = "lob")] 
    LOV_LOB LOV_LOB { get; set; } 
} 

[MetadataType(typeof(ILOV_LOB_MetaData))] 
[DisplayColumn("libelle", "libelle", false)] 
public partial class LOV_LOB : ILOV_LOB_MetaData 
{ 
    public short id { get; set; } 
    public string libelle { get; set; } 
    public System.DateTime date_val_debut { get; set; } 
    public System.DateTime date_val_fin { get; set; } 
} 

public partial interface ILOV_LOB_MetaData 
{ 
    [Key] 
    [Required(ErrorMessage = "id is required")] 
    short id { get; set; } 

    [Required(ErrorMessage = "libelle is required")] 
    [StringLength(5)] 
    string libelle { get; set; } 

    [Required(ErrorMessage = "date_val_debut is required")] 
    [DataType(DataType.Date)] 
    System.DateTime date_val_debut { get; set; } 

    [Required(ErrorMessage = "date_val_fin is required")] 
    [DataType(DataType.Date)] 
    System.DateTime date_val_fin { get; set; } 
} 

Prawdopodobnie nie działa, ponieważ próbuje posortować na właściwości obiektu, a nie na etykiecie, której używa, ale oczekiwałbym, że dane dynamiczne będą z nią korzystały (używa pierwszej właściwości łańcucha jako wartości wyświetlanej, dlaczego " t używa go do sortowania? Ponadto próbowałem również dodać atrybut DisplayColumn z tym samym wynikiem).

Próbowałem obsłużyć zdarzenie ListView.OnSorting, aby ręcznie edytować właściwość EntityDataSource.OrderBy, dodając do testowania wartość it.LOV_LOB.libelle. To nie zadziałało. Próbowałem również obsługiwać EntityDataSource.OnSelecting, aby zobaczyć, jaka jest wartość EntityDataSource.OrderBy (jeśli nie ustawię go ręcznie, zawsze jest null, nawet jeśli sortowanie działa). Wygląda na to, że jest on ignorowany lub zastępowany po tym wydarzeniu. Wyjątek nie określa, co OrderBy próbuje zastosować, więc nie jestem pewien, co próbuje zrobić. Próbowałem zaimplementować IComparable, ale nie zadziałało. Zmieniłem ToString(), aby zapewnić wartość wyświetlania, to też nie działa.

Nie mam pomysłu. Jakieś sugestie ?

Odpowiedz

0

Co ja wreszcie zrobiłem:

Jako komenda Sort nie działa, zrobiłem to działa poprzez określenie parametrów sortowania sobie:

  • w szablonie połączonego w PO, Zmieniłem nazwa polecenia w nagłówku CommandName = "Sort" do zwyczaju jeden CommandName = "CustomSort"
  • Dodaj mapowanie do ListView na stronie aspx: OnItemCommand="ListView1_ItemCommand"
  • Na stronie CodeBehind wykonałem polecenie niestandardowe (wiem, że przechowywanie informacji w Session jest złym pomysłem. Zobacz this question):

    protected void ListView1_ItemCommand(object sender, ListViewCommandEventArgs e) 
    { 
        if (e.CommandName == "CustomSort") 
        { 
         var sortInfos = Session["SortInfos"] as SortInfos; 
         var sortDirection = SortDirection.Ascending; 
         if (sortInfos != null && sortInfos.Sort == e.CommandArgument.ToString()) 
         { 
          sortDirection = sortInfos.SortDirection.HasValue && sortInfos.SortDirection == SortDirection.Ascending ? SortDirection.Descending : SortDirection.Ascending; 
         } 
    
         //Get columns metadata 
         var data = table.Columns.SingleOrDefault(c => c.Name == e.CommandArgument.ToString()); 
    
         string filter = null; 
         if (data is MetaForeignKeyColumn) 
          filter = String.Format("{0} {1}", data.SortExpression, sortDirection == SortDirection.Ascending ? "asc" : "desc"); 
         else 
          filter = String.Format("it.{0} {1}", data.SortExpression, sortDirection == SortDirection.Ascending ? "asc" : "desc"); 
    
         GridDataSource.OrderBy = filter; 
         GridDataSource.AutoGenerateOrderByClause = false; 
    
         Session["SortInfos"] = new SortInfos() { Sort = e.CommandArgument.ToString(), SortDirection = sortDirection }; 
        } 
    } 
    

    GridDataSource jest mój EntityDataSource przedmiot.
    SortInfos jest tylko klasa POCO z Sort i SortDirection właściwości

to działało całkiem dobrze.

1

Sortuj według LOV_LOB.id lub jednego z pozostałych atrybutów LOVE_LOB. Ponieważ sam LOV_LOB nie może być sortowany konwencjonalnie, tj. Według liczby lub daty/godziny, lub alfabetycznie, ale jego atrybutami są.

+0

Jeśli to nie rozwiąże problemu, proszę o przedstawienie zapytania. –

+0

Używam tutaj danych dynamicznych, co oznacza, że ​​nie mam żadnych zapytań, wszystko jest automatycznie obsługiwane przez 'EntityDataSource',' QueryExtender' i 'DynamicFilterExpression'. Jak już wspomniałem, próbowałem ręcznie wymusić 'EntityDataSource.OrderBy' na dowolną właściwość obiektu, ale wydaje się, że jest on ignorowany. Wiem, jak sortować kwerendę w SQL lub Entity Framework, ale nie mogę znaleźć, jak to zrobić z danymi dynamicznymi. –

+0

@JulienN kiedy mam czas, ponownie zapoznaję się z odpowiedzią –

Powiązane problemy