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?
Ich habe aktualisiert die post. Überprüfen Sie es bitte heraus.
InformationsquelleAutor Kassem | 2011-04-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein möglicher Grund HIERFÜR ist, dass die Anwendungsdomäne neu gestartet, die zwischen der ersten und der zweiten Aktionen und weil die Sitzung im Arbeitsspeicher gespeichert wird, wird es verloren sein. Dies könnte passieren, wenn Sie kompilieren Sie die Anwendung erneut zwischen den beiden. Versuchen Sie, eine Haltepunkte in der
Application_Start
undSession_Start
Rückrufe im Allgemeinen.asax und sehen, wenn Sie zweimal angerufen.sind cookies im browser aktiviert? Können Sie untersuchen mit FireBug, ob das cookie ursprünglich angelegt, wenn das hochladen der Dateien, die übertragen wird, zusammen mit der Aufforderung an den New () - Aktion?
Dimitrov: Es wurde kein cookie an Erster Stelle... Im firebug nur die cookies, die zeigte, wurden die .ASPXAUTH und ASP.NET_SessionId cookies...
so ist die
ASP.NET_SessionId
cookie gesendet, in der Anforderung an die New () - Aktion? Können Sie in einer Schleife in der New () - Aktion über alle session-Werte?Dimitrov: das habe ich versucht... aber die Session ist leer!!! Die Count-Eigenschaft 0 ist und die Tasten " count auch 0. Was könnte falsch sein?
InformationsquelleAutor Darin Dimitrov
Habe ich nur noch diese zum Weltweiten.asax.cs
Scheint es, dass dies das Problem beseitigt. Ich setzen Sie einen Haltepunkt, die getroffen wird, nur einmal pro session (wie erwartet).
Habt Ihr jemals herausfinden, warum das hilft?
Dies funktioniert finden mit MVC 5
Nicht für mich arbeiten.
InformationsquelleAutor Raphael Gabbarelli
Sind Sie jemals mit anderen als den Zugriff auf
HttpContext.Current
direkt im code? In anderen Worten, gibt es irgendwelche Orte, an denen Sie die Injektion derHttpContext
zum Wohle der Spott in unit-tests?Wenn Sie nur den Zugriff auf direkt in Ihren Methoden, dann gibt es keinen Grund, den Eintrag
x.For<HttpContext>().HttpContextScoped().Use(HttpContext.Current);
in der Sie die Anwendung starten. Ich Frage mich, ob es anfangen würde zu arbeiten, wenn Sie entfernt es.InformationsquelleAutor ataddeini