MVC accessing model of view at layout page - asp.net-mvc

I do not know the right approach to do it but I have one strange requirement in Razor
Scenario
I have a layout page being shared in 40 views, the layout pages also contain some label fields.
I have made a base class in Model which contains properties need to be displayed on Layout page, this class gets inherited in each and every model.
So basically when Model is passed to View it contain some properties to be displayed on layout.
Query
Is this is a right approach ? (If no then what is the right approach to do it?)
How to access the properties of model at view in layout page.

Partial View can be alternate but why not to make a Base class which contains Layout Properties and all the Model inherits Base Class
Check out this for more
Pass data to layout that are common to all pages

Related

Orchard Module as Partial view

I had created a module named Orchard.Blogs in my application. Now that blogs view can I make it as a partial view to my other views ? For Ex: http://localhost/Orchard.Web/Orchard.HrCompany/Payroll/GetPay is my url and in my GetPay View can I use Orchard.Blogs view as a partial view ?
In theory you can just use any view you like. However, many views require a view model. For instance, views returned by action methods probably have a view model. If you want to reuse that view, you will have to also provide an instance of that model.
Other views are used by shapes being rendered. If you want to render those views, you will have to actually create an instance of that shape. And if those views expect certain properties to exist on the shape, you will have to set those properties as well.
As you can probably see, this is not very straightforward, as it might potentially involve duplicating a lot of logic to build up the required data (think content part drivers that create shapes, for example).
What I would do instead, is let us know what particular views of the Blogs module you are looking to "reuse". Perhaps there are better ways. For example, there is a BlogArchives widget you might want to use. Or maybe a Projection Widget to render all posts of a particular Blog.
Depending on your exact use case scenario, there is bound to be a proper solution. Blindly reusing views from other modules is not typically done, because of the reasons I just listed.
All the views in orchard called "Shapes", and you can render any shape in any place with "IShapeFactory" interface, you can try the following code:
private readonly dynamic _shapeFactory;
public Constructor(IShapeFactory shapeFactory) {
_shapeFactory = shapeFactory;
}
public void CreateShape(){
dynamic customShape = _shapeFactory.CustomShape(ViewModel: viewModel);
}
This code with search on a view with name "CustomShape", then will render it using the named parameters we send.
On other side, you can display any shape directly in any view like:
#Display.CustomShape(ViewModel: viewModel)

How to use MVC Controllers for Layours in Sitecore?

I'm very new to sitecore and just started learning sitecore over at a dev-course held here in town.
The course is WebForms-focused, and since that's not my "patter of choice" I thought I would see how far I can get using MVC in Sitecore.
However, I have a slight problem. I have noticed how there are Controller Renderers, but and how they are bound to a Controller and such. but how about using a Controller for a Layout?
Lets say I have a layout, that for instance might statically render a menu on the top of the site. Then in this case I would like to avoid having a huge amount of code in my view for rendering the menu-items. Instead I would like to have build and populate a custom view model with the menu items and then simply pass down the model to the view and iterate through my menu items within my model.
But I just cant find a way of how to create a controller for a Layout. Any ideas?
Actually, this is possible, you can create a model deriving out of RenderingModel class or implement IRenderingModel interface and assign it to any MVC rendering or layout in Sitecore. Model object will be instantiated by the Sitecore's GetModel pipeline defined in Sitecore.Mvc.Config file.
See Here
Another way to handle this scenario is to create a Menu view rendering and then insert into a placeholder defined within the layout possibly a header placeholder. This can be statically assigned via standard values.
Kevin is right, thats not possible. Actually, Sitecore uses the layout to recognize a view extension and handle the request with MVC (TransferMvcLayout processor in the httpRequestBegin pipeline).
You should consider an approach where you add a placeholder in your layout:
#Html.Sitecore().Placeholder("menu-placeholder")
Then add a Menu Controller Rendering to that placeholder. That way you can utilize the rendering cache as well.
I don't think this is possible. But you can create a Razor view as layout, which works same as a View Rendering. Just just need to specify the path to the Razor view in the Path field and insert a model. In the model you could have simple property, which loads your menu items from whereever you want:
public class MyViewModel
{
public IEnumerable<MenuItem> MenuItems
{
return MyMenuUtil.LoadMenuItems();
}
}
This avoids lot of code in the Razor view and also in the model.

MVC logic in the view

I'm creating an MVC5 web application and was curious if what I'm doing is considered bad practice or not.
I've already made a table with paging. This is created by a partial view that loops through the models id, code and name properties and displays them. Since I want to make a generic table I've decided to derive all models from a model base class (BusinessObjectModel) and give that to the partial view. I've modified the partial view to use reflection to get the values of every property this way the table can display every property of the model. This works great and the only thing left to do is to create a custom attribute tag to control which property is displayed in the list.
Is putting such logic into the view considered as bad practice? Should I create a helper that would assemble this view in the controller instead?

How can I bind a partial view to a model in a layout view?

I have a layout view for a specific section (group of views) in my MVC4 application, and this layout should contain a dynamic treeview with navigation options for views that use this layout view. E.g. My layout view says each dependent view will have a treeview at the left. Now the only way I can think of properly loading this treeview in the layout for each dependent view is have it as a mandatory section in each dependent view, and use a common base viewmodel for each dependent view that carries a viewmodel for the treeview. This seems very awkward. How else can I do this?
I'm not sure that I have understood your question properly, but I think the concept you are looking for is known as "Child Actions" - see RenderAction on MSDN.
This lets you do something conceptually similar to RenderPartial in your view, but rather than having to pass it a model, RenderAction lets you create an action to retrieve the model.
This frees you from your view needing the models for each partial view.

MVC Project Design, pros and cons of re-using Partial Views

I have a question for the pros and cons on how reusable partial views should be used in a project.
In the first example, I have a layout that is used between all the views. In the layout, I have a partial view that gets called using Html.RenderAction("Index", "Header"). This header changes based on if the user is logged in or not and it renders on every view.
In the second example, I have a static layout that is used between all the views. However, in this layout there are no partial views being called. The Header partial view is being called on each view and basically does the same thing as the first example (changes based on if a user is logged in or not, etc.)
Which approach is better, is one way or another the correct way? Pros and cons of each?
One of the main ideas behind asp.net-mvc is to not reuse code. So with this in mind, you should have your Header code in your _Layout file. This way it is not being retyped in every View, and if you needed to remove it or add route values, etc you do not have to update every View that has it.
An example of this is the _LogOnPartial that is in a default project. In the _Layout it is called by #Html.Partial("_LogOnPartial"), and the _LogOnPartial view contains a logic statement that either displays LogOn or Register or Welcome back....

Resources