IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET MVC Discussion :

problème de retour de type json


Sujet :

ASP.NET MVC

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut problème de retour de type json
    Bonjour,

    hey oui encore moi. Joyeux noel à tous au passage
    J'essaie de créer une fonction appellée avec la fonction jQuery GetJson.
    voici mon code js :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $.getJSON("/admin/ManageBlog/LoadArticle/?articleId=" + id + "&callback=?",
                                function (json)
                                {
                                    alert('ok');
                                }
                            );
    et mon code asp.net :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public JsonResult LoadArticle(string articleId)
            {
                Guid id = Guid.Parse(articleId);
                Entity_Blog articleBlog = BLL_ArticleBlog.Get(id);
                JsonResult json = Json(articleBlog, JsonRequestBehavior.AllowGet);
                return json;
            }
    et voici mon erreur sous chrome :
    L'instance ObjectContext a été supprimée et ne peut plus être utilisée pour les opérations qui requièrent une connexion.

    Description : Une exception non gérée s'est produite au moment de l'exécution de la requête Web actuelle. Contrôlez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.

    Détails de l'exception: System.ObjectDisposedException: L'instance ObjectContext a été supprimée et ne peut plus être utilisée pour les opérations qui requièrent une connexion.

    Erreur source:

    Une exception non gérée s'est produite lors de l'exécution de la requête Web actuelle. Les informations relatives à l'origine et l'emplacement de l'exception peuvent être identifiées en utilisant la trace de la pile d'exception ci-dessous.

    Trace de la pile:


    [ObjectDisposedException: L'instance ObjectContext a été supprimée et ne peut plus être utilisée pour les opérations qui requièrent une connexion.]
    System.Data.Objects.ObjectContext.EnsureConnection() +8608582
    System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) +46
    System.Data.Objects.ObjectQuery`1.Execute(MergeOption mergeOption) +31
    System.Data.Objects.DataClasses.EntityCollection`1.Load(List`1 collection, MergeOption mergeOption) +243
    System.Data.Objects.DataClasses.EntityCollection`1.Load(MergeOption mergeOption) +25
    System.Data.Objects.DataClasses.RelatedEnd.Load() +37
    System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad() +8080126
    System.Data.Objects.DataClasses.EntityCollection`1.System.Collections.IEnumerable.GetEnumerator() +25
    System.Web.Script.Serialization.JavaScriptSerializer.SerializeEnumerable(IEnumerable enumerable, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +61
    System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +1380
    System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +194
    System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +502
    System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +1424
    System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +194
    System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +502
    System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +1424
    System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +194
    System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj, StringBuilder output, SerializationFormat serializationFormat) +26
    System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj, SerializationFormat serializationFormat) +74
    System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj) +6
    System.Web.Mvc.JsonResult.ExecuteResult(ControllerContext context) +329
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13
    System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +23
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +260
    System.Web.Mvc.<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b() +19
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +177
    System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343
    System.Web.Mvc.Controller.ExecuteCore() +116
    System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97
    System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
    System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37
    System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
    System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
    System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50
    System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
    System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8963149
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184

    Informations sur la version : Version Microsoft .NET Framework :4.0.30319; Version ASP.NET :4.0.30319.237
    j'ai fouillé sur google, partout ils disent qu'il suffit d'ajouter "JsonRequestBehavior.AllowGet" dans le retour, ce que j'ai fait comme vous pouvez le voir.

    savez-vous ce qui coince ? j'y suis depuis s9h ce matin O_o.

    merci bien

  2. #2
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    j'ai une liste de détails plus précis à propos de mon erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Request URL:http://localhost:17082/admin/ManageBlog/LoadArticle/?callback=jQuery162029900423320941627_1324905785177&articleId=c5aa9e67-cdee-48c2-9175-cb7f7f72b1c3&_=1324905786592
    Request Method:GET
    Status Code:500 Internal Server Error
    Request Headersview source
    Accept:text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
    Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
    Accept-Encoding:gzip,deflate,sdch
    Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
    Connection:keep-alive
    Host:localhost:17082
    Referer:http://localhost:17082/admin/ManageBlog
    User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7
    X-Requested-With:XMLHttpRequest
    Query String Parametersview URL encoded
    callback:jQuery162029900423320941627_1324905785177
    articleId:c5aa9e67-cdee-48c2-9175-cb7f7f72b1c3
    _:1324905786592
    Response Headersview source
    Cache-Control:private
    Connection:Close
    Content-Length:12801
    Content-Type:text/html; charset=utf-8
    Date:Mon, 26 Dec 2011 13:23:06 GMT
    Server:ASP.NET Development Server/10.0.0.0
    X-AspNet-Version:4.0.30319
    ce qui est étrange, c'est que chrome reconnait la réponse comme étant du text/html :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Content-Type:text/html; charset=utf-8

  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    La sérialization JSON provoque le chargement des collections qui sont les propriétés de ton objet via le Lazy-Loading. Or, comme le contexte de base de données a été détruit, il n'y a plus accès. Il faut soit désactiver le lazy loading, soit forcer le chargement des entités.

  4. #4
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    j'avoue ne pas connaitre ces termes. Lequel serait le plus efficace ? je fais des recherches là-dessus, je vous tiendrais au courant de mes avancées

    Ce qui est étrange, c'est que j'obtiens bien mes données. J'ai créé un point d'arrêt au niveau du retour de la fonction, j'ai regardé mon objet json vite fait, et j'ai bien vu qu'il était correctement valorisé.

    merci.

  5. #5
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    ok apparemment le lazy loading est un mode de chargement de données plus lent mais plus performant. (lazy = paresseux non ?).

    Comment puis-je le désactiver ou forcer le chargement ?
    Apparemment pour désactiver le lazy il faut insérer le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    context.ContextOptions.LazyLoadingEnabled = false;
    seulement je n'y arrive pas :/

  6. #6
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    ok j'avance.

    Premièrement, j'ai réussi à valoriser LazyLoadingEnabled à false.
    j'ai réécris mon code.

    jquery :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $.ajax({
                                type: 'GET',
                                url: "/admin/ManageBlog/LoadArticle",
                                data: {
                                    articleId: "c5aa9e67-cdee-48c2-9175-cb7f7f72b1c3"
                                },
                                dataType: "json",
                                contentType: "application/json; charset=utf-8",
                                async: false,
                                cache: false,
                                timeout: 30000,
                                success: function (json) {
                                    alert(json);
                                }
                            });
    asp.net mvc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public JsonResult LoadArticle(string articleId)
            {
                Guid id = Guid.Parse(articleId);
                Entity_Blog articleBlog = BLL_ArticleBlog.Get(id);
                JsonResult json = Json(articleBlog, JsonRequestBehavior.AllowGet);
                return json;
            }
    dorénavant, une nouvelle erreur apparait (encore -_-) :
    Référence circulaire détectée lors de la sérialisation d'un objet de type 'System.Data.Metadata.Edm.AssociationType'.

  7. #7
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    J'ai compris le problème.
    J'utilise un pseudo héritage dans mon mcd. comme je n'ai pas pu retranscrire mon héritage dans mon dataaccess, je l'ai simplifié :



    voilà donc une relation 1->0,1.

    La référence circulaire vient de là, je pense qu'il s'agit de l'origine de mon problème.

    voici le code de ma classe DAL_ArticleBlog :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using myPortfolio.DataAccess.Entity;
     
    namespace myPortfolio.DataAccess
    {
        public class DAL_ArticleBlog
        {
            protected static List<Entity_Blog> GetList()
            {
                using (DataContext db = new DataContext())
                {
                    return (from blog in db.PortfolioContext.tbl_ArticleBlog
                            join article in db.PortfolioContext.tbl_Article on blog.Article_id equals article.Article_id
                            select new Entity_Blog() { Article = article, ArticleBlog = blog }).ToList();
                }
            }
     
            protected static Entity_Blog Get(Guid articleBlogId)
            {
                using (DataContext db = new DataContext())
                {
                    return (from blog in db.PortfolioContext.tbl_ArticleBlog
                            join article in db.PortfolioContext.tbl_Article on blog.Article_id equals article.Article_id
                            where article.Article_id == articleBlogId
                            select new Entity_Blog() { Article = article, ArticleBlog = blog }).SingleOrDefault();
                }
            }
     
            protected static void Add(Entity_Blog articleBlogToAdd)
            {
                using (DataContext db = new DataContext())
                {
                    db.PortfolioContext.tbl_Article.AddObject(articleBlogToAdd.Article);
                    db.PortfolioContext.tbl_ArticleBlog.AddObject(articleBlogToAdd.ArticleBlog);
                    db.PortfolioContext.SaveChanges();
                }
            }
     
            protected static void Delete(Entity_Blog articleBlogToDelete)
            {
                using (DataContext db = new DataContext())
                {
                    db.PortfolioContext.tbl_Article.DeleteObject(articleBlogToDelete.Article);
                    db.PortfolioContext.tbl_ArticleBlog.DeleteObject(articleBlogToDelete.ArticleBlog);
                    db.PortfolioContext.SaveChanges();
                }
            }
     
            protected static void Update(Entity_Blog articleBlogToUpdate)
            {
                using (DataContext db = new DataContext())
                {
     
                }
            }
        }
    }
    et le code de ma classe Entity_ArticleBlog :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace myPortfolio.DataAccess.Entity
    {
        public class Entity_Blog
        {
            public tbl_Article Article { get; set; }
            public tbl_ArticleBlog ArticleBlog { get; set; }
     
            // article
            public Guid Id
            {
                get { return ArticleBlog.Article_id; }
                set { ArticleBlog.Article_id = value; }
            }
     
            public string Title
            {
                get { return Article.Article_title; }
                set { Article.Article_title = value; }
            }
     
            public string Text
            {
                get { return Article.Article_text; }
                set { Article.Article_text = value; }
            }
     
            public DateTime CreatedDate
            {
                get { return Article.Article_written_at; }
                set { Article.Article_written_at = value; }
            }
     
            public DateTime? UpdatedDate
            {
                get { return Article.Article_updated_at; }
                set { Article.Article_updated_at = value; }
            }
     
            public bool IsPublished
            {
                get { return Article.Article_is_published; }
                set { Article.Article_is_published = value; }
            }
     
            // blog
            public string Source
            {
                get { return ArticleBlog.Blog_source; }
                set { ArticleBlog.Blog_source = value; }
            }
        }
    }
    que dois-je faire pour que ça marche ?

Discussions similaires

  1. Probléme de retour d'un type ArrayList dans une méthode JAVA
    Par KnowPart dans le forum Collection et Stream
    Réponses: 20
    Dernier message: 21/01/2011, 09h40
  2. [MySQL] problème de retour à la ligne.
    Par NPortmann dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/09/2005, 14h43
  3. Problème de requete avec type monétaire
    Par Pymm dans le forum ASP
    Réponses: 11
    Dernier message: 09/09/2005, 16h57
  4. Problème de champs Paradox type : mémo formaté
    Par mjp dans le forum Bases de données
    Réponses: 6
    Dernier message: 05/04/2005, 21h13
  5. [Struts] Problème de retour chariot
    Par pimousse76 dans le forum Struts 1
    Réponses: 5
    Dernier message: 22/11/2004, 15h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo