User Control Equivalent in ASP.NET MVC 4 - asp.net-mvc

I'm working on a new ASP.NET MVC 4 app. I'm really trying to do things the "MVC" way. In particular, I'm interested in using the Razor view engine. Please note that I come from a web forms background, so my questions may seem awkward.
I'm trying to learn if there is something equivalent to user controls in MVC? If so, what are they called? If not, what is the recommended way to creating a reusable component in MVC?

You're looking for #Html.Action and #Html.Partial.
They allow you to either render a partial view or a full blown controller action in a view. This is a common pattern of reuse in MVC land.
Occasionally you would want to make displayFor or editorFor templates, if a controller action is too heavy. The rule of thumb is if you need to do it multiple times on the page and it needs to be posted back in a form, think about doing it in a template.
Controls in asp.net cover a rather large swath which MVC granularizes a bit more.

To creating a reusable HTML component in MVC you can create a partial view in the Views/Shared folder and use #HTML.Partial("_PartialViewName") to include it in any other view or partial view. You can find out more about partial views in this article.

You could try:
Add a View Start _ViewStart.cshtml in Shared folder
Make Layout Null (if required) #{ Layout = null; }
Call this page where you want like #Html.Partial("_ViewStart")

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.

Multiple Views in the same page MVC ASP.NET

I want to display different Views on the same page in ASP.NET MVC technology . How can it be acheived.
I have data coming in from 2 different Tables and for that i have 2 different Views for display. How can I display both these views on one single page.
Is there a concept of a View within a view in MVC ? Or is there some provision for making a master view which can encapsualte multiple views. ?
These link's will help you (first gain knowledge of Partial view)
http://www.dotnet-tricks.com/Tutorial/mvc/2IKW160912-Partial-View-in-Asp.net-MVC3-Razor.html
http://www.codeproject.com/Articles/351867/Basics-of-ASP-NET-MVC3-Part-II
http://www.c-sharpcorner.com/UploadFile/aravindbenator/mvc-3-razor-and-partial-view/
ASP.NET MVC supports the ability to define "partial view" templates that can be used to encapsulate view rendering logic for a sub-portion of a page. "Partials" provide a useful way to define view rendering logic once, and then re-use it in multiple places across an application.
Refer:
Re-use UI Using Master Pages and Partials
Creating Partial View
Yes, the aspx webforms has the Master page and then you use user controls .ascx files.
With MVC, the "master page" is by default under
Views\Shared\_Layout.cshtml
Now you can also end up using the wonderful Twitter bootstrap and really start to make greater looking layouts with easy to use css etc..
Your controller can return
PartialViewResult
as mentioned by the other answers from the others, those links should get you on your way.

How to Create ASPX Pages in MVC 4

I used to develop with ColdFusion for a while, but then left the web development arena for a while. I'm back, now, and have been hired as an intermediate (right above entry)-level web developer. My workplace is using MVC 4, but is not using the Razor view engine. The two MVC 4 books that I've purchased (as well as the huge number of tutorials and blogs out there) only discuss using Razor- which I AM using in my self-study, but I need to understand how it works when NOT using the Razor engine.
When using the ASPX view engine, how do you go about using it? Does it work like a normal ASPX page, where I place my ASP.NET controls on the page and then reference them with the code-behind in C#? Only, rather than using ASP.NET controls, I'm using HtmlHelper methods instead? Keep in mind, I'm not asking about the basic format of using <% %> instead of <#, because most of that was covered here: http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx. I fail to understand how traffic will get routed to those ASPX pages through my basic HomeController (which just has a few ActionResult() methods, nothing large).
I can elaborate more, if need be.
All MVC view pages follow the same life cycle regardless of the view engine:
Routing - The request is mapped to an action method (using request data like URL, querystring, session, etc)
Controller - A controller is created for the matching action method. It's populated with all the environment, request, and session data
Action - The matching action method is called
Result - The ActionResult returned by the action method is executed. For a view result, this means: 1) The view engine locates a matching view name, 2) the matching view is instantiated with any model data returned by the action method, 3) the view is processed by the view engine.
That means a WebForms view will be executed by the MVC WebForms view engine, not by the ASP.NET WebForms system. The view engine will perform some basic parsing to add the data from your model to your view (as specified with <%%>).
Also, FYI you can even mix view engines in a single project (requires some setup).
Look at
The ethos of MVC is to get rid of code behind so the old way of drag drop onto the designer and manipulating the control from code behind has become somewhat out dated or redundant. If you are already using HTML5 helpers .. I would continue to do so.
This is purely a personal view ... but I would make a case for using Razor.
Edit: You pass the model to the view ... the model holds the data.
If you are using ASP.NET MVC then forget about code behind. As for as the view engines are concerned you can go razor or aspx way means the syntax you can use on your views is either razor or aspx. Routing will not be affected by your choice of view engine.(It will behave same whether you choose razor view engine or aspx.
And NO aspx views does not behave like normal aspx webform, no code behind no viewstate etc
Here is a good comparison of ASP.NET and ASP.NET MVC and Here is comparison of different view engines.

ASP.NET MVC Custom Controls

Is it safe to say that custom controls with ASP.NET MVC are most times just partial views? And if that's the case, I'm guessing it's always up to the implementing application to dictate the behavior (through controller code) of these controls?
I have done a bit of searching, and there is almost no resources on ASP.NET MVC custom controls (either that, or I'm missing the mark with my Google skills).
Partial views are more a template for either a control or a set of controls that can be shared between views.
I'm not sure they are "Custom Controls" as such and it sounds like you are coming from an ASP viewpoint.
I think you need to first get in the mindset of MVC and out of ASP.
So for a list of items you may have a partial view that takes the list of items and a partial view that takes an actual item. So "pvCustomerList<List<customer>>" and "pvCustomer<customer>".
The pcCustomerList iterates through the list and creates a pvCustomer for each customer in the list.
Partial Views don't really have code in the controller. Instead they are passed data from the view. If there is a submit action in the partial view, then this is either handled by the controller for the view or a jQuery post back.
I hope this clears things up a little for you.
Have you checked out NerdDinner sample?
There is nice article on asp.net mvc website regarding form helpers (helper methods for views). there is explained how to create custom helper method
Link is http://www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs

are you still creating complex user controls in asp.net MVC?

Is there a new model or best-practise for creating complex controls in asp.net MVC?
Do you use code-behind or inline to mirror your view pages?
My model is this:
I tend to use Partial Views when there is a view element that I'll need to use more than once. Or if I need to display multiple complex object in a view.
I use RenderAction from the futures assembly when I need a "reusable widget" of sorts. It has it's own controller and is better at handling more complex logic than a Partial View.
Finally, I tend to write Html Helper methods for things I may use in other projects (like paging links, etc).
I would use a partial view for complex things. Check out this article
Controls in MVC don't generally have (any) code behind. You use PartialViews as ascx controls, you pass them a model and you display the contents of the model.
You can create custom controls in mvc and these compile to a dll which is moveable between projects etc and these are a little more complex but essentially they spit out html like the partial view does.
You can also create jQuery plugins that are pretty cool and again, they can spit out html based on a model.
So a typical mvc view may be comprised of several partial views each of which are dedicated to a model or hierarchy of models.
Partial views can also display partial views so you can send a complex model to a partial view which in turn renders other partial views each of which deal with a more atomic part of your model.
I've been writing a lot of my own HtmlHelper extension functions. The November meeting of http://www.c4mvc.net/ that was recorded today gives some great examples of control type code placed in HtmlHelper extension functions. The recording should be online soon.
You may also want to check out the Telerik Extensions for ASP.NET MVC. They're open source, so even if you don't use their controls, you can get some insight into controls in ASP.NET MVC by taking a look at how a commercial control vendor approached the problem.
Coming from a PHP turned webforms turned ASP.NET MVC background, I find myself relying a lot more on basic html/css/javascript.
I've never been a fan of controls, even with webforms because they always ended up being messy compared to js/html/css counterparts.

Resources