У меня почти точно такой же сценарий, описанный Натоном Тейлором в ASP.NET MVC - Совместное использование состояния сеанса между контроллерами . Проблема в том, что если я сохраню путь к изображениям внутри переменной сеанса List
, он не будет определен обратно в 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();
Session[SessionKeys.Images] = imageList;
}
((List)Session[SessionKeys.Images]).Add(fileName);
}
Затем внутри моего ItemController есть метод действия New (), который имеет следующий код:
List imageNames;
var images = new List();
if (Session[SessionKeys.Images] != null) //always returns false
{
imageNames = Session[SessionKeys.Images] as List;
int rank = 1;
foreach (var name in imageNames)
{
var img = new Image {Name = name, Rank = rank};
images.Add(img);
rank++;
}
}
Итак, почему это происходит и как мне решить эту проблему?
Кроме того, Я думал о том, могу ли я переместить ActionMethod, который позаботится о загрузке изображений в ItemController и сохранить пути к изображениям внутри свойства List в самом ItemController, будет ли это работать? Обратите внимание, что изображения загружаются и обрабатываются с помощью запроса 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
И в моем файле Global.asax:
private static IContainer ConfigureStructureMap()
{
ObjectFactory.Configure(x =>
{
x.For().Use();
x.For().Use();
x.For().Use();
x.For().Use();
x.For().Use();
x.For().Use();
x.For().Use();
x.For().Use();
x.For().Use();
x.For().Use();
x.For < IImagesService>().Use();
x.For().Use();
x.For().Use();
x.For().Use();
x.For().HttpContextScoped().Use(HttpContext.Current);
x.For(typeof(Validator<>)).Use(typeof(NullValidator<>));
x.For>().Use();
x.For>().Use();
});
Func validatorFactory = type =>
{
var valType = typeof(Validator<>).MakeGenericType(type);
return (IValidator)ObjectFactory.GetInstance(valType);
};
ObjectFactory.Configure(x => x.For().Use(() => new ValidationProvider(validatorFactory)));
return ObjectFactory.Container;
}
Есть мысли?