Nathon Taylor가 설명한 정확히 동일한 시나리오가 ASP.NET MVC - Sharing Session State Between Controllers입니다. 문제는 세션 변수 내에서 이미지에 대한 경로를 저장하면 List<string>
모든 경로가 손실되도록 ItemController에 다시 정의되지 않는다는 것입니다. 여기 내 설정이 있습니다 :세션 변수가 컨트롤러와 동작 방법간에 손실 됨
Inside ImageController Inside 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의 나는 다음과 같은 코드가 새() 액션 메소드가 있습니다
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 자체의 List 속성 안에 이미지 경로를 저장할 수 있는지 생각해 보았습니다. 실제로 작동합니까? 그러나 이미지가 업로드되고 AJAX 요청을 통해 처리됩니다.
나는 코드를 업데이트했습니다 : 사용자가 항목을 입력 양식을 제출 그런 때, 이미지와 함께 항목에 대한 모든 데이터는
는 업데이트 ... 데이터베이스에 저장해야합니다. 또한 나는 내가 컨트롤러 Factor로 StructureMap을 사용하고 있다고 덧붙여 야한다고 생각한다. 범위가 지정된 문제 일 수 있습니까? 일반적으로 StructureMap에서 사용하는 기본 범위는 무엇입니까?
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;
}
어떤 생각 :
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 파일 내부
?
몇 가지 코드를 추가 할 수 있습니까? 특히 AddToSession 메서드를 호출하는 컨트롤러? 다른 스레드에서 Session에 액세스하지 않는 한 이런 일이 발생하지 않아야합니다. – neebz
@nEEbz : 게시물을 업데이트했습니다. 확인해주세요. – Kassem