Session-Variablen Verloren Zwischen Controller & Action-Methoden

Ich habe fast genau das gleiche Szenario beschrieben von Nathon Taylor in ASP.NET MVC - application-Sharing-Sitzung Stand Zwischen Steuerungen. Das problem ist, dass wenn ich speichern den Pfad zu den Bildern in einer Session-variable List<string> es ist nicht definiert wird zurück in den ItemController also alle Pfade sind verloren... Hier ist mein setup:

Innen ImageController ich habe die Upload () - Methode Aktion:

    public ActionResult Upload()
    {
        var newFile = System.Web.HttpContext.Current.Request.Files["Filedata"];
        string guid = Guid.NewGuid() + newFile.FileName;
        string itemImagesFolder = Server.MapPath(Url.Content("~/Content/ItemImages/"));
        string fileName = itemImagesFolder + "originals/" + guid;
        newFile.SaveAs(fileName);

        var resizePath = itemImagesFolder + "temp/";
        string finalPath;
        foreach (var dim in _dimensions)
        {
            var resizedPath = _imageService.ResizeImage(fileName, resizePath, dim.Width + (dim.Width * 10/100), guid);
            var bytes = _imageService.CropImage(resizedPath, dim.Width, dim.Height, 0, 0);
            finalPath = itemImagesFolder + dim.Title + "/" + guid;
            _imageService.SaveImage(bytes, finalPath);
        }
        AddToSession(guid);
        var returnPath = Url.Content("~/Content/ItemImages/150x150/" + guid);
        return Content(returnPath);
    }

    private void AddToSession(string fileName)
    {
        if(Session[SessionKeys.Images] == null)
        {
            var imageList = new List<string>();
            Session[SessionKeys.Images] = imageList;
        }
        ((List<string>)Session[SessionKeys.Images]).Add(fileName);
    }

Dann in meinem ItemController ich habe die New () - Methode folgenden code:

        List<string> imageNames;
        var images = new List<Image>();
        if (Session[SessionKeys.Images] != null) //always returns false
        {
            imageNames = Session[SessionKeys.Images] as List<string>;
            int rank = 1;
            foreach (var name in imageNames)
            {
                var img = new Image {Name = name, Rank = rank};
                images.Add(img);
                rank++;
            }
        }

Ok so, warum ist das passiert und wie kann ich es lösen?

Auch, ich überlegte, ob ich mich bewegen könnte, die ActionMethod, kümmert sich um das hochladen der Bilder in den ItemController und speichern die Pfade zu den Bildern in einer Liste Eigenschaft auf den ItemController sich, würde, die wirklich funktionieren? Aber beachten Sie, dass Bilder hochgeladen werden und die Betreuung über einen AJAX-request. Dann, wenn der Nutzer das Element Formular alle Daten zu dem Element, das zusammen mit den Bildern gespeichert werden sollen, die auf die Datenbank...

Update:

Habe ich aktualisiert, der code. Ich denke auch, ich sollte hinzufügen, dass ich mit StructureMap wie mein controller factorory. Könnte es sein, dass ein scoping-Problem? Was ist der Standard-Umfang ist in der Regel von StructureMap?

public class StructureMapDependencyResolver : IDependencyResolver
{
    public StructureMapDependencyResolver(IContainer container)
    {
        _container = container;
    }

    public object GetService(Type serviceType)
    {
        if (serviceType.IsAbstract || serviceType.IsInterface)
        {
            return _container.TryGetInstance(serviceType);
        }
        else
        {
            return _container.GetInstance(serviceType);
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _container.GetAllInstances<object>()

            .Where(s => s.GetType() == serviceType);
    }

    private readonly IContainer _container;
}

In meinem Global.asax-Datei:

    private static IContainer ConfigureStructureMap()
    {
        ObjectFactory.Configure(x =>
        {
            x.For<IDatabaseFactory>().Use<EfDatabaseFactory>();
            x.For<IUnitOfWork>().Use<UnitOfWork>();
            x.For<IGenericMethodsRepository>().Use<GenericMethodsRepository>();
            x.For<IUserService>().Use<UsersManager>();
            x.For<IBiddingService>().Use<BiddingService>();
            x.For<ISearchService>().Use<SearchService>();
            x.For<IFaqService>().Use<FaqService>();
            x.For<IItemsService>().Use<ItemsService>();
            x.For<IMessagingService>().Use<MessagingService>();
            x.For<IStaticQueriesService>().Use<StaticQueriesService>();
            x.For < IImagesService<Image>>().Use<ImagesService>();
            x.For<ICommentingService>().Use<CommentingService>();
            x.For<ICategoryService>().Use<CategoryService>();
            x.For<IHelper>().Use<Helper>();
            x.For<HttpContext>().HttpContextScoped().Use(HttpContext.Current);

            x.For(typeof(Validator<>)).Use(typeof(NullValidator<>));

            x.For<Validator<Rating>>().Use<RatingValidator>();
            x.For<Validator<TopLevelCategory>>().Use<TopLevelCategoryValidator>();
        });

        Func<Type, IValidator> validatorFactory = type =>
        {
            var valType = typeof(Validator<>).MakeGenericType(type);
            return (IValidator)ObjectFactory.GetInstance(valType);
        };

        ObjectFactory.Configure(x => x.For<IValidationProvider>().Use(() => new ValidationProvider(validatorFactory)));
        return ObjectFactory.Container;
    }

Irgendwelche Gedanken?

können Sie einige weitere code hinzufügen? speziell Ihrem Controller, wo Sie anrufen, die AddToSession Methode ? Das sollte nicht passieren, es sei denn, Sie sind auf die Sitzung aus einem anderen thread.
Ich habe aktualisiert die post. Überprüfen Sie es bitte heraus.

InformationsquelleAutor Kassem | 2011-04-30

Schreibe einen Kommentar