2016-04-27 7 views
7

sto cercando di creare un sito web Dynamic Data che dovrebbe consentire a un amministratore di modificare direttamente i dati nella maggior parte delle tabelle di un database."L'ORDER BY chiave di ordinamento (s) tipo deve essere fine-comparabile" con i dati dinamici

Finora, ho un EDMX e POCO classi, tutti collegati ad un'interfaccia utilizzata per applicare le DataAnnotations sui campi.
Voglio avere una griglia modificabile per ogni tabella, così ho modificato il modello ListDetails e seguito these instructions, che mi permette di avere la modifica in linea in un controllo ListView.
Con tutti questi, posso visualizzare e modificare i dati. Funziona.

Ma quando clicco sul colpo di testa (è un LinkButton con il Comando Sort e il nome della colonna come CommandArgument) di una colonna ForeignKey, ho sempre arrivare la seguente eccezione (ma i lavori di ordinamento sugli immobili "semplici"):

[EntitySqlException: il tipo di chiave di ordinamento ORDER BY deve essere comparabile all'ordine. Vicino espressione membri accesso, riga 6, colonna 3.]
Microsoft.AspNet.EntityDataSource.EntityDataSourceView.ExecuteSelect (DataSourceSelectArguments argomenti) 1325
System.Web.UI.DataSourceView.Select (DataSourceSelectArguments argomenti, DataSourceViewSelectCallback callback) + 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 incl. udeStagesBeforeAsyncPoint, booleano includeStagesAfterAsyncPoint) +974

Esempio di tabella che sto cercando di visualizzare e ordinare (sto visualizzazione e la modifica LINK_ENTITES_MODELISEES, sto cercando di risolvere la colonna 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; } 
} 

Probabilmente non funziona perché sta cercando di ordinare sulla proprietà dell'oggetto e non sull'etichetta che sta usando, ma mi aspetterei che i dati dinamici lo gestiscano (usa la prima proprietà della stringa come valore di visualizzazione, perché può ' lo usa per l'ordinamento? Inoltre ho anche provato ad aggiungere l'attributo DisplayColumn, con lo stesso risultato).

Ho provato a gestire l'evento ListView.OnSorting per modificare manualmente la proprietà EntityDataSource.OrderBy, aggiungendo il valore it.LOV_LOB.libelle manualmente, per il test. Non ha funzionato. Ho anche cercato di gestire EntityDataSource.OnSelecting per vedere che cosa è il valore di EntityDataSource.OrderBy (se non lo imposto manualmente è sempre null anche se l'ordinamento funziona). Sembra che venga ignorato o sostituito dopo questo evento. E l'Eccezione non specifica quale Ordine si sta cercando di applicare, quindi non sono sicuro di cosa stia cercando di fare. Ho provato a implementare IComparable ma non ha funzionato. Ho sovrascritto ToString() per fornire il valore di visualizzazione, non ha funzionato neanche.

Sono fuori di idea. Qualche suggerimento ?

risposta

0

Quello che ho finalmente fatto:

Come il comando Sort non funzionava, ho fatto il lavoro specificando i parametri di ordinamento tra me:

  • Nel modello collegato nel PO, ho cambiato il nome del comando nell'intestazione CommandName = "Sort" ad uno personalizzato CommandName = "CustomSort"
  • Aggiungi la mappatura al ListView nella pagina aspx: OnItemCommand="ListView1_ItemCommand"
  • Nella pagina CodeBehind, ho gestito il comando personalizzato (lo so, la memorizzazione delle informazioni nel Session è una cattiva idea. Vedere 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 è la mia EntityDataSource oggetto.
    SortInfos è solo una classe POCO con Sort e SortDirection proprietà

ha funzionato abbastanza bene.

1

Ordina su LOV_LOB.id o uno degli altri attributi LOVE_LOB. Come un oggetto LOV_LOB stesso non è ordinabile in modo convenzionale, cioè per numero o datetime, o in ordine alfabetico, ma sono gli attributi.

+0

Se questo non risponde alla tua domanda, puoi per favore mostrare la tua richiesta. –

+0

Qui sto usando Dati dinamici, il che significa che non ho alcuna query, tutto viene gestito automaticamente da 'EntityDataSource',' QueryExtender' e 'DynamicFilterExpression'. Come ho già detto, ho provato a forzare manualmente "EntityDataSource.OrderBy" su qualsiasi proprietà dell'oggetto, ma sembra essere ignorata. So come ordinare una query in SQL o Entity Framework, ma non riesco a trovare come farlo con Dynamic Data. –

+0

@JulienN quando avrò tempo rivisiterò la mia risposta –

Problemi correlati