当前位置: 首页 > 面试题库 >

控制器和操作方法之间丢失的会话变量

宦博超
2023-03-14
问题内容

我几乎与Nathon Taylor在ASP.NET MVC-
控制器之间的共享会话状态中描述的场景完全相同。问题是,如果我将路径保存到Session变量中的图像List<string>,则不会在ItemController中定义它,因此所有路径都将丢失…这是我的设置:

在ImageController内部,我具有Upload()操作方法:

    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);
    }

然后在我的ItemController中,我有New()操作方法,该方法具有以下代码:

        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++;
            }
        }

好的,为什么会这样,我该如何解决?

另外,我还在考虑是否可以将负责将图像上载的ActionMethod移到ItemController中,并将图像路径存储在ItemController本身的List属性内,这是否有效?不过请注意,图像是通过AJAX请求上传和处理的。然后,当用户提交项目输入表单时,有关该项目的所有数据以及图像应保存到数据库中。

更新:

我已经更新了代码。另外我想我应该补充一点,我正在使用StructureMap作为我的控制器析因。可能是范围界定问题吗?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;
}

在我的Global.asax文件中:

    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;
    }

有什么想法吗?


问题答案:

造成这种情况的一个可能原因是,应用程序域在第一个动作和第二个动作之间重新启动,并且由于会话存储在内存中,因此它将丢失。如果您在两者之间重新编译应用程序,则可能会发生这种情况。尝试在Global.asax
中的Application_StartSession_Start回调中放置一个断点,看看它们是否被调用过两次。



 类似资料:
  • 问题内容: 我正在阅读有关Angular验证的文章,并认为在我自己的项目中使用它会很好。它运行得非常好,我想在成功验证表单后在其他控制器中扩展它的访问方法。我尝试了各种方法来执行此操作,但似乎看不到$ scope对象中的方法。 我希望有人能告诉我我想念的东西才能完成这项工作。我叉了个笨蛋。 问题答案: 正确的方法是使用角度服务。例如: 这样,您可以在注入到的任何控制器中访问内部功能: 看到这个演示

  • 在本章中,我们将学习进程组,会话和作业控制。 进程组 - 进程组是一个或多个进程的集合。 进程组由共享相同进程组标识符(PGID)的一个或多个进程组成。 进程组ID(PGID)与进程ID具有相同的类型(pid_t)。 进程组有一个进程组领导,即创建组的进程,进程ID变为组的进程组标识。 会话 - 它是各种进程组的集合。 作业控制 - 这允许shell用户同时执行多个命令(或作业),一个在前台,另一

  • 空操作 空操作是指系统在找不到指定的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化。 下面的例子用空操作功能实现了一个城市切换的功能。 我们只需要给City控制器类定义一个_empty (空操作)方法: <?php namespace app\index\controller; class City { public fu

  • 如果我们必须在同一规范上下文中执行多个get,那么在控制器规范中是否有任何方法可以在每次get之前“重置”实例变量空间? 我理解每个测试一个断言的指导方针。但是,对于我们的一组测试,如果我们在每个get之前不在(: each)设置之前进行单独的(冗长的)设置,并且如果我们在单个上下文中一起运行一系列get/asserts,它的运行速度会快3倍。 但是,似乎(与通过浏览器调用控制器方法不同)如果您使

  • 我找到了很多关于这个问题的答案,但没有解决我的问题-所以我想给你看我的代码,希望有人能找到错误... 我有一个标准的超文本标记语言的形式,给一些数据与POST到下一个. php文件,我得到它,并将其保存到会话变量。我使用会话变量有两个原因: 如果有人重新加载页面,它应该显示与以前相同的信息 我需要在即将到来的php文件中的变量 代码如下: 第一个调用工作精细会话变量被设置,回声给出正确的值。重新加

  • 问题内容: 我一直在这里看问题:将MVCajaxjson发布到控制器操作方法,但不幸的是,它似乎并没有帮助我。我的几乎完全相同,除了我的方法签名(但是我已经尝试过了,但仍然没有被击中)。 jQuery的 控制者 但是,无论我尝试什么,我都不会受到打击。通过调试,我知道它发送了一个请求,每次都会得到一个错误。 问题答案: 您的操作需要字符串参数,但是您要发送一个复合对象。 您需要创建一个与您要发送的