asp.net - Why Session is getting lost every-time -
update:
if refresh page data session , have postback through submit or onchange losses session
here cod onchange event
onchange = "document.location.href = '/home/employee?c=' + this.options[this.selectedindex].value;" }
<div class="col-xs-5"> @html.dropdownlistfor(m => m.name, new selectlist((system.collections.ienumerable)viewbag.dropdownname, "value", "text"), new { @class = "form-control", onchange = "document.location.href = '/home/employee?c=' + this.options[this.selectedindex].value;" }) </div> i have no idea why session getting lost , everytime postback page seems loosing session null.... i'm doing wrong here?
public static class sessionhelper { public static void storesessionhomeindexviewmodel(homeindexviewmodel list) { httpcontext.current.session.add("homeindexviewmodel", list); } public static homeindexviewmodel getsessionhomeindexviewmodel() { return ((homeindexviewmodel)httpcontext.current.session["homeindexviewmodel"]); } } controller:
private homeindexviewmodel loaddata() { var vmodel = new homeindexviewmodel(); if (sessionhelper.getsessionhomeindexviewmodel() == null) { vmodel = new homeindexviewmodel { employee = _db.cemployee.tolist() }; sessionhelper.storesessionhomeindexviewmodel(vmodel); } else { vmodel = sessionhelper.getsessionhomeindexviewmodel(); } return vmodel; }
are using uri based sessions?
if are, see bottom of answer quick-and-dirty solution (or read on full explanation.)
the thing can think of, you're using uri save session this. if are, url this:
http://www.domain.com/(s(rzibneny21box4rtmi))/home/employee if that's you're doing, when submit form or change document.location, loose session id, unless preserve (s(rzibneny21box4rtmi)) part of uri. part of uri session id.
the above explain why simple page refresh preserves session while overwriting document.location not. if overwrite document.location, you'll lose session id.
example: works cookie session (not uri sessions)
i've updated answer based on use of onchange event. works on machine if i'm using cookies session not if set cookieless true.
in example, tried emulate select list, though mine turns out differently yours did. that's because wasn't sure of view model's structure. it's enough examples sake.
view
in view, i've include both submit button , onclick event changes document.location. both work expected cookie sessions (but not uri sessions.)
with cookies, new employee appears in select list , number of employees increments expected.
@model webapp.models.homeindexviewmodel <form action="~/home/employee"> @html.dropdownlistfor(m => m.firstname, new selectlist(model.employees, "firstname", "lastname"), new { onchange = "document.location.href = '/home/employee?c=' + this.options[this.selectedindex].value;" }) <label>number of employees @model.employees.count</label> <button type="submit">submit</button> </form> model
i wasn't sure of view model's structure, created 1 purposes of example.
namespace webapp.models { using system.collections.generic; public class homeindexviewmodel { public class employee { public string firstname { get; set; } public string lastname { get; set; } } public list<employee> employees = new list<employee>() { new employee() { firstname = "firstname0", lastname = "lastname0" }, new employee() { firstname = "firstname1", lastname = "lastname1" } }; public string firstname { get; set; } } } controller
for example's sake, employee action method adds new employee object collection , returns index view.
namespace webapp.controllers { using system.web.mvc; using models; using helpers; public class homecontroller : controller { public actionresult index() { var model = loaddata(); return view(model); } public actionresult employee(string firstname) { var model = loaddata(); return view("index", model); } private homeindexviewmodel loaddata() { var vmodel = new homeindexviewmodel(); if (sessionhelper.getsessionhomeindexviewmodel() == null) { vmodel = new homeindexviewmodel(); sessionhelper.storesessionhomeindexviewmodel(vmodel); } else { vmodel = sessionhelper.getsessionhomeindexviewmodel(); var count = vmodel.employees.count; vmodel.employees.add(new homeindexviewmodel.employee() { firstname = string.format("firstname{0}", count), lastname = string.format("lastname{0}", count) }); } return vmodel; } } } helper
the same helper had in original question.
namespace webapp.helpers { using system.web; using models; public static class sessionhelper { public static void storesessionhomeindexviewmodel(homeindexviewmodel list) { httpcontext.current.session.add("homeindexviewmodel", list); } public static homeindexviewmodel getsessionhomeindexviewmodel() { return ((homeindexviewmodel)httpcontext.current.session["homeindexviewmodel"]); } } } the above works when session uses cookies. if system.web section of web.config has cookieless="true", above example not work, because form submission and/or update of document.location.href not preserve (s(rzibneny21box4rtmi)) part of uri , thereby not preserve session.
example: works uri sessions!
if using uri session, must set either form.action or document.location in way preserves session id. instance, here hacked together. works on machine cookieless sessions.
@model webapp.models.homeindexviewmodel <script type="text/javascript"> window.onload = function () { // domain plus session id var index = document.location.tostring().lastindexof(")"); var sub = document.location.tostring().substring(0, index + 1); // using base url // set form action & onchange event document.getelementbyid("myform").action = sub + "/"; document.getelementbyid("myselect").onchange = function () { document.location.href = sub + "/home/employee?c=" + this.options[this.selectedindex].value; }; }; </script> <form id="myform" action=""> @html.dropdownlistfor(m => m.firstname, new selectlist(model.employees, "firstname", "lastname"), new { id = "myselect" }) <label>number of employees @model.employees.count</label> <button type="submit">submit</button> </form> this works expected, because form.action , onclick include session id in request uri. using cookieless sessions?
Comments
Post a Comment