MVC :: Session Vs TempData / How To Persist Values From Controller To Controller
May 30, 2010
I have a filter on my MVC web site. I display some records in a few different controller actions but when moving from one action to another I want to apply those filter values.
How can I persist values from controller to controller?
Should I use Session? TempData?
I am using Structure Map for IOC.
Maybe I could have a class that contains a Property for each Session Value that I use in my application and inject it on the controllers that need session?
I was under the impression that TempData was only persisted across one action but I am seem to be seeing the behaviour that it is persisted across one action only on the same controller.For example in a single controller if I do the following in my Event Controller,
TempData("test") = "Moo"
And then after displaying a view I then move to a new action (either by a GET or POST or redirect) I can read back the data,
TempData("test") = "Moo"
If I then move on to another action (either by a GET or POST or redirect) and check for TempData("test") I should get Nothing.However I have just tried this with two controllers and I get a very bizarre problem.For example on my first Controller, called Event Controller I set the TempData("test") = "Moo".I then move to an action on a second controller called Main Controller. I read back TempData("test") and find "Moo" as the result which is to be expected. I then perform some sort of task and a new GET, POST or Redirect request is made back to the Event Controller.
At this point I am expecting TempData("test") to be nothing, since I have already passed it to an action once already. However when I test this I am actually getting TempData("test") = "Moo" which I thought was not the expected behaviour, since in effect it would be like using Session("test) instead.
UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development, that follows the UP(Unified Process). It uses a Grasp Controller pattern to interact with domain classes by some methods like NewSale(), AddNewItemToSale() and CloseSale. In windows form, I can instantiate a object of this class in the UI and then use its methods to perform the actions. This works well in Client apps, but when I use asp.net mvc, I cannot find a way to instantiate an object (one for each user) that was always visible for a Controller (MVC). I cannot insert as an attribute inside Controller because it always create a new one.
my MVC2 delete and only my delete controller is refusing to return any class information. Its really similar to my edit function and the views are all auto-generated so I don't see the problem.
Function Delete(ByVal id As Integer) As ActionResult
I have a simple model where a Person has Gifts. I have a view which is a list of Gifts belonging to one Person.
My problem is with the Create action for a new Gift. I want it to default to the PersonID that we are already viewing the list of Gifts for. I tried simply passing the last PersonID (they are all the same)
Html.ActionLink("Create New", "Create", new { id = Model.Last().PersonID }) which works fine if there is already at least one Gift for that person but if this is the first Gift I don't have a value.
My Gift List controller knows the PersonID I want to pass but the view doesn't.
How do I pass this PersonID from my Gift List controller to my Gift Create controller via the Gift List view? Or is there a better way to do this?
I'm implementing IHttpHandler and IRequiresSessionState and I'm using context.Session but after I set up a value in Session, it's lost in the next request. What can I do to persist the values ?
I am trying to get into grips with AJAX/JQuery and MVC. i need to access the session on the controller. This doesnt seem to be initialised at the constructor level but there needs to be a way I can store items in the session in the constructor depending on the parameter values (an extra constructor is written here) I am also doing unit testing here, which has been provided by 3rd party and they are using this extra constructor.
So the idea here is that when the page is loaded, JQuery will request a collection of items (which will be stored in session) and also be able to post to the page so items are added into the collection too. So, what is the best way here to get access to the session in the constructor of a controller?
I have a User entity and a department entity. I have a UserViewModel and DepartmentListModel which has List of departments.
UserViewModel has a property of type DepartmentListModel .
Now on user/create action I need to populate DepartmentListModel by calling DepartmentController's list action. List action returns populated DepartmentListViewModel.
From UserController how do I set DepartmentListModel ?
I'm calling an action from another controller using this code
[Code]....
But inside "ApproveOperation" action, I needed the Session variables. It seems when I called it from another controller (not the owning controller), the Session variables can not be accessed (null value).How can I get the same Session variables just like it was called from the owning controller?
I am having a form in a view page that looks as below:
[Code]...
Now when the form is posted, I am trying to retrieve the values submitted in the controller as below:
[Code]...
The string value shows null when I submit the form by checking some checkboxes. Is this the way to retrieve the values or am I doing something wrong? And I cannot use html control because all other controls on the form are server controls and I am not sure if I can only make this control a html control. And I am not sure how can I bind the values to it?
the code for getting the dropdown selected values (both TextField and ValueField) in MVC Controller class.
This is my case, I have a dropdown filled with Product category. Its having default value as "--Select--". I want validate this dropdown selected any values or not in controller action method. How will i do this stuff?
I have an ASP.NET MVC2 application that supports visualization plug-ins/providers. The IVisualization interface is defined in a common assembly which is referenced by both the ASP.NET MVC2 app, and any visualization providers.
In the Visualization controller, I have a method which returns all the applicable visualizations for a given set of data. In order to scan the available providers, I use the following code in the controller's ActionMethod.
var catalog = new DirectoryCatalog(HttpRuntime.BinDirectory); var container = new CompositionContainer(catalog); var visualizations = container.GetExportedValues<IVisualization>();
However, I feel like if I have the following in the controller
[ImportMany] public IEnumerable<IVisualization> Visualizations { get; set; }
then the import should happen automatically. What am I missing that prevents the automatic imports?
Also, is the code that I am currently using going to kill scaling of website?
I'm working on a mvc project that builts a table of items and each row has a button to submit that row to the controller. Now each button has an id and I use hidden input to store the data in that column. How do I post the id to the controller? I use Html.beginform() at the beginning and a submit button. I want the ID to appear in the URL so I can extract the data based on that.
Also I can see that my values are posted but they don't show up in the query string. How do I get these values in the controller? The code is like this. [Code]....
I am creating an ASP.NET application that allows users to edit and insert data that is persisted in a SQL Server database.I would like to implement a controller class that handles queries for certain entities, caches results and triggers events when data is inserted or updated.I need one of these controller classes for each entity in my data model.What I'm unsure of is how to create a singleton class of this sort that different user sessions can access.
For example,I have a Employee entity in my data model.I would like to have an EmployeeController class that handles retrieving the employees from the database, sends inserts and updates to the database,keeps a cache of all employees and triggers events when an employee is inserted or updated.Objects in other user sessions could then listen and respond to these events.
Am I on the right track?Should I be using the ASP.NET MVC framework to accomplish this?How do I instantiate these controller classes when the first user needs them and have subsequent concurrent users access the same class?
EDIT:I've been researching the idea of a controller class as an anti-pattern since @TomTom's answer.I'm not convinced one way or the other.I still need an answer to question #3 above.Let's just drop the specific idea of a controller class for now. How do I create any class that is:accessible by multiple user sessions,allows only one instance,is deleted if there are no user sessions,and triggers events that other classes can listen to.
I'm having problems passing values from the controller to the view. I created a boolean variable to use as a flag and want the view to render some html based on whether its true or false.
Unfortunately ViewData doesn't look like it can pass boolean values. I should be able to pass any datatype to a view (string, int, bool, etc...)
may I ask one seemingly simple question - I have a Javascript function that loops through my checkboxes(they're plain HTML checkboxes, not using the helper methods), and for every checked one it's adding its value to an array. So now, how do I get this array in my controller so that I can assign its values to the fields, i.e. object's properties?
This is my checkbox code:
[Code]....
and the script:
[Code]....
and here's the controller code:
[Code]....
Now, this langID should be assigned every checked checkbox's value, so I guess I'm missing a loop here too, it should go until some border that's gotten from the client script or something, but my bigger problem is how to retrieve the posted values from the javascript, something like PHP's POST["array"]...?
This Request.Form works fine when just one checkbox is checked, but now I need it to work with several checked..
I am working on Tenant module that has to display following fileds, Tenant Id, Tenant Desc, Contact Person, Contact Phone. In the DB, these are designed as two separate tables - Tenant and Contact. Tenant table has Tenant Id, tenant Desc and Contact Id . Contact table has all the contact related properties. I am using EF as DAL.
To make my system loosely coupled, I have created a repository pattern to talk to EF entities. Also, for validation I am using service layer.
My repository layer has two interfaces and classes corresponding to Tenant and Contact.
public interface ITenantRepository : IRepository<Tenant> // IRepository<T> is a generic interface for CRUD operations { Tenant Get(int id); IEnumerable<Tenanr> List() ;
I built a base controller class inherits from Controller class to add some custom behavior to all controllers which will inherit from this base class.
My issue is when I try to access HTTPContext and Session objects in my custom base class, they are always null.
Am I doing something wrong or need missing something?
My custom base class definition:
public class ApplicationControllerBase : Controller
controllers classes definition:
public class HomeController : ApplicationControllerBase
using ASP.NET MVC 1, .NET 3.5.
UPDATE:
It seems the issue is I try to access HTTPContext in the constructor while HTTPContext is not ready yet, I tried it in the OnActionExecuted event handler and it works fine.
My question is what is the best place to access Session object in my custom controller class, that will guarantee executing my code with all controllers.