Reuse views and controller logic in MVC3 - renderaction

in my MVC3 based application I often need to reuse the same functionality in different views.
Example: One view to search for users. Another view to show the search results and enable the user to select one or more of the returned records. At the end those records have to be passed to the original view/controller.
How can I use (if at all) RenderAction and a, let's say, UserAccountSelectionController to build a reusable set of controller(s) and views? How would my reusable controller "know" where to pass the selected user models to? Is there a different approach to create reusable components the MVC3 way?
Your help is greatly appreciated.
Regards,
Kevin

Related

MVC partial views, partial model, partial controller?

Currently i am investigating if MVC is the way to go for the new major version of our web application. We have an existing web application with webparts, dynamically rendered according to some user settings. Each webpart has its own data and own logic (for example, one webpart with user information, one webpart with currently logged-in users, one webpart with appointments etc. etc.).
What we need to accomplish (i think) is to render a single view, which contains several partial views. Each partial view represents a different model, and has its own logic.
I figured out how to put multiple partial views within a single view, but i don't know how to handle the business logic for each view (in "partial controllers"? if possible at al?), and handle the model for each view?
So the main purpose is to render a page with multiple dynamic views (according to what the user has configured), each with its own logic and data. And then when, for example, a button is clicked in a partial view, the corresponding controller is called to handle the event, and returns the updated partial view. The partial views need to be loosely coupled, and updated async.
From what i've seen so far the most tutorials and documentation are focussing on MVC in general, not on how to separete the business logic and model for eachr partial view.
So I'm not asking how to do this, but:
Is it possible to easy accomplish this with MVC 4 or 5?
Does anybody know a good real-life example or tutorial about this?
I hope anyone can point me in the right direction or share some thoughts on this...
You could make one or more controllers with an action for each webpart.
Group all related webparts in the same controller but make an action and View+ViewModel for each webpart. Then use the Html.RenderAction method to call these actions (and have your webparts placed) on your page/main view.
DISCLAIMER: This said, each call to Html.RenderAction creates a complete mvc flow, instanciating a controller, model and view and finally renders the whole thing and passes the value to your page/main view. Having lots of Html.RenderAction has the potential to slow your page creation a lot. You could look into DI/IoC like Unity and consider reusing controllers, or just look into System.Web.Mvc.DependencyResolver to handle the creation of controllers yourself.

can I have one model which uses two methods in the some controller?

I am currently developing a asp.net mvc application. I was wondering if I can have one model (my database) and then have one controller which contains two methods which access the same model but retrieve different rows?
I have a database and I would like to use the same controller to access the same database but need two methods in that controller as I am trying to get different rows of data and present it in two different views?
I'm able to understand the question but you might want to improve it a bit.
So in general practise a controller can be used to process different requests either based on:
A controller per page.
Controller for a section of page (view) categorised by functionality.
Controller based on data/model its retrieving.
There are other ways by which controllers are defined.
In your case, the controller interacts with the same Model(DB) and returns data for two different views.
Assuming that the model(DB) is for a certain purpose/ stores certain data, this is an acceptable way of using the controller.
You need to also consider other portions of the application and how you've coded it. Having a convention across the codebase and arriving at that convention of how you want to separate the controllers will give you a better idea and will be more maintainable in the long run.

Bad idea to manually edit a scaffolded view?

I scaffolded a new MVC controller, along with a corresponding view and repository for an IEnumerable collection of a POCO class. In the resulting view is a table that will list every entry in the collection of that class. However, the table also contains a column for every property in that class, and I only want to display a subset of them in this view. Is it a bad idea if I now manually edit the view to remove what I don't want to display in the generated HTML?
I'm not clear on whether the scaffolding features that are part of ASP.NET MVC (version 3 and later) are designed to generate the basic functionality for your web application, giving you the freedom to do what you want with the results afterwards, or if it's considered a best practice to leave the generated results alone and find another way to do what I want to accomplish. I know that you can customize your own scaffolding templates, but that seems like a lot of work for such a simple change.
Thanks!
It's definitely OK to edit the scaffolded view. This is just a feature that's there to quickly build the basics, but that will never suffice.
So you can just edit it all you want. Keep in mind though that if you edit your model, you will have to manipulate your view manually, but that's normal I think.
Scaffold will HELP you to generate a View strongly typed to a Model. Of course, if you want, you can update the html in your views. Another good tip: Instead of using your Model, create a ViewModel based on this Model, and put only the properties you need to display in the View.
View this content:
https://stackoverflow.com/a/11064362/1384539

How do I display multiple pieces of user information on every page in ASP.NET MVC 2?

I'm building a site in ASP.NET MVC 2 that will allow for anonymous users and registered users. When a user is logged in, I want to display multiple pieces of information related to that profile on every page (i.e. hometown, favorite color, etc.). From a view perspective, I understand using Master pages and creating partials to keep it DRY.
However, where I am getting stuck is how do I pass this user information to the view for every page? I already have the relationships between database tables established (I'm using EF), so I can do this on an individual basis for each action through ViewData, but that's obviously ridiculous for every page on the site.
So far, my research has started to lead me down the path of creating a base controller and base view model that the other controllers and view models will inherit from. But I feel like I'm missing something obvious. Any pointers?
If you have your Master page use the RenderAction method, it can invoke controller actions for the various repetitive parts of your page, each of which can perform data access and render a partial view. That allows you to separate your view models while still displaying certain elements on all your pages.
This approach works great for us.
We use a base controller to store it in ViewData.
You could also use an action attribute on the controller rather than inheriting from a base controller.
You could create a base class for your models that contains the data that is display on every page.

Action with AuthorizeAttribute or Dynamic UI in MVC 2 - Best practice?

There's so much I'm enjoying with asp.net MVC 2...but sometimes I feel like I'm trying to find a needle lurking in that haystack by beating it with a stick.
So. I have a list of objects. I have a strongly-typed view, which lists those objects. I have data annotations coming back just lovely, and all is well and good.
Now I want to create an admin view of that very same list. Do I:
Create a new view, called AdminList, and put all the administrative goodies in there (CRUD!), in a new action in the same controller, and decorate both actions with [Authorize], or
Modify the existing view, so that it dynamically detects the role of the current user and enables/disables admin functionality appropriately, or
Some third option?
I'm looking for the cleanest, least brittle approach.
TIA!
I would recommend you externalizing common parts in reusable partials and in the main view depending on the user role enables/disables admin functionality. Also it's not the view responsibility to test the user roles, this should be done by the controller and include this information into the view model (like a boolean property ShouldDisplayAdminPanel) so that the view decides whether or not include partials.

Resources